2010-01-06 2 views
14

Я изучаю Python и BeautifulSoup, чтобы очистить данные из Интернета и прочитать таблицу HTML. Я могу прочитать его в Open Office, и он говорит, что это таблица № 11.Как вы можете получить все строки из определенной таблицы с помощью BeautifulSoup?

Кажется, что BeautifulSoup является предпочтительным выбором, но может ли кто-нибудь сказать мне, как захватить конкретный стол и все строки? Я просмотрел документацию по модулю, но не могу обойти его. Многие из примеров, которые я нашел в Интернете, похоже, делают больше, чем мне нужно.

ответ

24

Это должно быть довольно прямолинейно, если у вас есть кусок HTML для синтаксического анализа с помощью BeautifulSoup. Общая идея состоит в том, чтобы перейти к вашей таблице с помощью метода findChildren, затем вы можете получить текстовое значение внутри ячейки с свойством 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

Это была трюка! Код работал, и я должен иметь возможность изменять его по мере необходимости. Большое спасибо. И последний вопрос. Я могу следовать за кодом, кроме тех случаев, когда вы просматриваете таблицу для детей th и tr. Это просто поиск в моей таблице и возврат строк таблицы и таблицы? Если бы мне нужны только строки таблицы, я бы просто искал только tr. большое спасибо! – Btibert3

+2

Да, '.findChildren (['th', 'tr'])' ищет элементы с типом тега 'th' или' tr'. Если вы просто хотите найти элементы 'tr', вы должны использовать' .findChildren ('tr') '(обратите внимание, что нет списка, просто строка) –

+0

Также стоит отметить, что [PyQuery] (https://pythonhosted.org /pyquery/api.html) - действительно очень хорошая альтернатива BeautifulSoup. –