2010-01-06 3 views
14

Ich lerne Python und BeautifulSoup, um Daten aus dem Internet zu kratzen, und lese eine HTML-Tabelle. Ich kann es in Open Office lesen und es heißt, dass es Tabelle 11 ist.Wie erhalten Sie alle Zeilen aus einer bestimmten Tabelle mit BeautifulSoup?

Es scheint wie BeautifulSoup ist die bevorzugte Wahl, aber kann mir jemand sagen, wie man einen bestimmten Tisch und alle Reihen ergreift? Ich habe mir die Moduldokumentation angeschaut, kann mich aber nicht darum kümmern. Viele der Beispiele, die ich online gefunden habe, scheinen mehr zu tun, als ich brauche.

Antwort

24

Das sollte ziemlich einfach sein, wenn Sie ein Stück HTML haben, um mit BeautifulSoup zu parsen. Die allgemeine Idee besteht darin, mithilfe der Methode findChildren zu Ihrer Tabelle zu navigieren. Dann können Sie den Textwert innerhalb der Zelle mit der Eigenschaft string abrufen.

>>> from BeautifulSoup import BeautifulSoup 
>>> 
>>> html = """ 
... <html> 
... <body> 
...  <table> 
...   <th><td>column 1</td><td>column 2</td></th> 
...   <tr><td>value 1</td><td>value 2</td></tr> 
...  </table> 
... </body> 
... </html> 
... """ 
>>> 
>>> soup = BeautifulSoup(html) 
>>> tables = soup.findChildren('table') 
>>> 
>>> # This will get the first (and only) table. Your page may have more. 
>>> my_table = tables[0] 
>>> 
>>> # You can find children with multiple tags by passing a list of strings 
>>> rows = my_table.findChildren(['th', 'tr']) 
>>> 
>>> for row in rows: 
...  cells = row.findChildren('td') 
...  for cell in cells: 
...   value = cell.string 
...   print "The value in this cell is %s" % value 
... 
The value in this cell is column 1 
The value in this cell is column 2 
The value in this cell is value 1 
The value in this cell is value 2 
>>> 
+0

Das war der Trick! Der Code funktionierte und ich sollte ihn nach Bedarf ändern können. Danke vielmals. Eine letzte Frage. Ich kann dem Code folgen, außer wenn Sie die Tabelle für Kinder th und tr suchen. Sucht das einfach meine Tabelle und gibt sowohl den Tabellenkopf als auch die Tabellenzeilen zurück? Wenn ich nur die Tabellenzeilen haben wollte, könnte ich einfach nur nach tr suchen? vielen dank nochmal! – Btibert3

+2

Ja, '.findChildren (['th', 'tr'])' sucht nach Elementen mit dem Tag-Typ 'th' oder' tr'. Wenn Sie nur 'tr' Elemente finden möchten, würden Sie' .findChildren ('tr') 'verwenden (no not list, nur die Zeichenfolge) –

+0

Es lohnt sich auch zu beachten, dass [PyQuery] (https://pythonhosted.org /pyquery/api.html) ist eine wirklich sehr schöne Alternative zu BeautifulSoup. –