2016-10-09 5 views
1

ich auf einem Web-Scraping Projekt arbeite, und ich habe die folgenden Artikel, die ich auf dem Web-Schürf planen:Schöne Suppe Problem mit Screen Scraping

<td class="country"> 
    <div> 
    <img alt="Niger" height="27" src="http://assets.rio2016.nbcolympics.com/country-flags/52x35/NIG.png" width="40"/> 
    Niger           
    </div> 

In diesem Fall versuche ich, das Land Niger raus Die Liste. Ich habe einen ganzen Tisch, an dem ich versuche, alle Länder herauszuholen. Der aktuelle Code, den ich habe, sieht wie folgt aus:

response = requests.get('http://www.nbcolympics.com/medals') 
soup = BeautifulSoup(response.content, 'lxml') 
for td in soup.findAll("td",{"class": "country"}): 
    print(td) 

Das wird mir zu viel Information bringen. Ich möchte mich nur auf den Länderwert in der Tabelle konzentrieren. (Diese Tabelle hat alle Länder, die an den Olympischen Spielen teilgenommen.) Wenn ich versuche, wie etwas zu tun:

for td in soup.findAll("td",{"class": "country"}).children: 

bekomme ich folgende Fehlermeldung:

Traceback (most recent call last): 
File "idea.py", line 15, in <module> 
    for row in soup.find_all('tr').children: 
AttributeError: 'ResultSet' object has no attribute 'children' 

Ich weiß, dass es eine sein muss So kann ich durch jeden dieser TDs schauen, um den Länderwert herauszuholen. (Ich kann das Land mit get_text() bekommen, aber es gibt viel mehr Informationen, die damit einhergehen.) Wenn der div-Wert eine Klasse hätte, dann wäre es meiner Meinung nach auch ziemlich einfach. Danke für jede Hilfe.

habe ich auch versucht:

for td in soup.findAll("img", {"width": "40"}) 
     print(td) 

die fast bekommt mir, was ich will. Es wird Folgendes gedruckt:

<img alt="Togo" height="27" src="http://assets.rio2016.nbcolympics.com/country-flags/52x35/TOG.png" width="40"/> 

Allerdings bekomme ich nicht das Land direkt danach! Aber ich bin gerade dabei!

Antwort

1

findAll gibt eine ResultSet von gefundenen Elementen zurück, die ein iterable ist. Sie müssen Schleife über die gefundenen Elemente und Zugang .text:

for element in soup.findAll("img", {"class": "country"}): 
    print(element.get('alt', '')) 

ich den "td",{"class": "country"} Selektor ersetzt haben, da Sie für ein Bild mit der Klasse country suchen.

+0

Ja, ich habe aktualisiert, um zu zeigen, was passiert, wenn Sie das IMG-Tag verwenden - es bringt mich fast, was ich will, aber stoppt direkt vor dem Land. Also, es bringt mich nur, was ich will aber nicht ganz! Danke für die Hilfe! –

+0

Ich habe meine Antwort aktualisiert, es sollte Ihr Problem beheben. Das nächste Mal versuchen, google "beautifulsoup get image alt", und Sie werden Ihre Antwort finden. –

+1

Verstanden, das scheint zu funktionieren! Vielen Dank! –