2010-01-06 19 views
14

Uczę się Python i BeautifulSoup, aby skrobać dane z sieci i czytać tabelę HTML. Mogę go przeczytać w Open Office i mówi, że jest to Tabela nr 11.Jak uzyskać wszystkie wiersze z określonej tabeli przy użyciu BeautifulSoup?

Wydaje się BeautifulSoup jest preferowanym wyborem, ale może ktoś mi powiedzieć jak chwycić konkretnej tabeli i wszystkie wiersze? Przyjrzałem się dokumentacji modułu, ale nie mogę się z tym pogodzić. Wiele przykładów, które znalazłem w Internecie wydaje się robić więcej, niż potrzebuję.

Odpowiedz

24

To powinno być dość proste, jeśli masz kawałek HTML do analizowania z BeautifulSoup. Ogólną ideą jest przejście do tabeli przy użyciu metody findChildren, a następnie można uzyskać wartość tekstową wewnątrz komórki za pomocą właściwości string.

>>> 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

To była podstęp! Kod zadziałał i powinienem móc go zmodyfikować w razie potrzeby. Wielkie dzięki. Ostatnie pytanie. Mogę postępować zgodnie z kodem, z wyjątkiem sytuacji, gdy przeszukujesz stół dla dzieci, które mają tr. Czy to po prostu przeszukuje mój stół i zwraca zarówno wiersze nagłówka, jak i tabeli? Gdybym tylko chciał wierszy tabeli, po prostu mógłbym szukać tylko tr? wielkie dzięki jeszcze raz! – Btibert3

+2

Tak, '.findChildren (['th', 'tr'])) szuka elementów z typem znacznika' th' lub 'tr'. Jeśli chcesz po prostu znaleźć elementy "tr", użyjesz '.findChildren ('tr')' (nie notuj listy, tylko ciąg) –

+0

Warto również zauważyć, że [PyQuery] (https://pythonhosted.org /pyquery/api.html) jest naprawdę świetną alternatywą dla BeautifulSoup. –

Powiązane problemy