2017-07-28 5 views
3

Ich habe ein Buch und Dokumente auf BeautifulSoup. Beide sagen, dass ich in der Lage sein sollte, find/find_all-Methoden zu ketten und Indizes zu verwenden, um genau das zu bekommen, was ich von einer einzelnen Seite kratzen möchte. Dies scheint nicht der Fall zu sein. Betrachten Sie die folgende Tabelle.Kann nicht finden und find_all in BeautifulSoup

<tr> 
<td><span style="display:none;" class="sortkey">Dresser !</span><span class="sorttext">**<a href="/wiki/Louise_Dresser" title="Louise Dresser">Louise Dresser</a>**</span></td> 
<td><span style="display:none;" class="sortkey">Ship !</span><span class="sorttext"><i><a href="/wiki/A_Ship_Comes_In" title="A Ship Comes In">A Ship Comes In</a></i></span></td> 
<td><span style="display:none;" class="sortkey">Pleznik !</span><span class="sorttext">Mrs. Pleznik</span></td> 
</tr> 
<tr> 
<td><span style="display:none;" class="sortkey">Swanson !</span><span class="sorttext"><a href="/wiki/Gloria_Swanson" title="Gloria Swanson">Gloria Swanson</a></span></td> 
<td><i><a href="/wiki/Sadie_Thompson" title="Sadie Thompson">Sadie Thompson</a></i></td> 
<td><span style="display:none;" class="sortkey">Thompson !</span><span class="sorttext">Sadie Thompson</span></td> 
</tr> 
<tr> 
<th scope="row" rowspan="6" style="text-align:center"><a href="/wiki/1928_in_film" title="1928 in film">1928</a>/<a href="/wiki/1929_in_film" title="1929 in film">29</a><br /> 
<small><a href="/wiki/2nd_Academy_Awards" title="2nd Academy Awards">(2nd)</a></small></th> 
<td style="background:#FAEB86"><b><span style="display:none;" class="sortkey">Pickford !</span><span class="sorttext">**<a href="/wiki/Mary_Pickford" title="Mary Pickford">Mary Pickford</a>**</span> <img alt="Award winner" src="//upload.wikimedia.org/wikipedia/commons/f/f9/Double-dagger-14-plain.png" width="9" height="14" data-file-width="9" data-file-height="14" /></b></td> 

Für jede Tabellenzeile muss ich das erste Element, dann den Text innerhalb des ersten verschachtelten Tags greifen. Lousie Dresser wäre der erste Datenpunkt, gefolgt von Gloria Swanson und dann Mary Pickford.

Ich dachte, der folgende würde mich dorthin bringen, aber ich lag falsch und 6 Stunden später bin ich ausgegeben.

def getActresses(URL): 
    try: 
     html = urlopen(URL) 
    except HTTPError: 
     print("Page not found.") 
     return None 
    try: 
     bsObj = BeautifulSoup(html, "lxml") 
     soup = bsObj.find("table", {"class":"wikitable sortable"}) 
    except AttributeError: 
     print("Error creating/navigating soup object") 
    data = soup.find_all("tr").find_all("td").find("a").get_text() 
    print(data) 


getActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress") 

Dies ist nicht der einzige Code, den ich ausprobiert habe. Ich habe versucht, Zeilen zu durchlaufen, dann Datenzellen zu tabellieren und dann auf ein Tag zuzugreifen. Ich habe versucht, nach Tags zu fragen und sie dann neu auszugeben, nur um zu erfahren, dass ich den Text, den ich haben wollte, nicht haben konnte. Der häufigste Fehler, den ich bei Kettenoperationen (wie oben) bekommen habe, ist AttributeError: 'ResultSet' object has no attribute 'find'. Subskribieren funktioniert absolut nicht, selbst wenn man Buchbeispiele repliziert (go fig ?!). Außerdem habe ich Prozesse abgebrochen, von denen ich nicht wusste, dass sie möglich waren.

Gedanken darüber, was vor sich geht und warum etwas, das so einfach sein sollte, so ein Ereignis zu sein scheint, würde enorm geschätzt werden.

Antwort

5
import requests 
from bs4 import BeautifulSoup 

def getActresses(URL): 
    res = requests.get(URL) 

    try: 
     soup = BeautifulSoup(res.content, "lxml") 
     table = soup.find("table", {"class":"wikitable sortable"}) 
    except AttributeError: 
     print("Error creating/navigating soup object") 

    tr = table.find_all("tr") 

    for _tr in tr: 
     td = _tr.find_all("td") 
     for _td in td: 
      a = _td.find_all("a") 
      for _a in a: 
       print(_a.text.encode("utf-8")) 

getActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress") 

verwenden die text statt get_text() und sorry ich requests Modul

find_all Methode wird immer eine Liste, zu zeigen, verwendet, so dass Sie eine Schleife haben durch sie

Es tut mir leid, ich bin ein neu stackoverflow, ich weiß nicht, wie man Antworten schreibt. Wie auch immer ich glaube, der Code wird Ihre Zweifel beseitigen

+0

Definitiv auf dem richtigen Weg und keine Entschuldigung. Ich kann nicht für jeden sprechen, aber ich habe die Erfahrung gemacht, dass die meisten hier freundlich sind. Ihre Antwort hat mich nahe gebracht. Die Ausgabe ist eine Liste von Namen (was gut ist), aber sie sind in der falschen Reihenfolge und enthalten Namen, die in der Antwortgruppe unerwünscht sind, so dass meine nächste Aufgabe das aussortieren wird, aber sogar bis zu diesem Punkt hätte war ohne Ihre Hilfe unmöglich. Vielen Dank! :) – Ryan

Verwandte Themen