BeautifulSoup HTML разбора таблицы - PullRequest
17 голосов
/ 13 января 2010

Я пытаюсь проанализировать информацию (html-таблицы) с этого сайта: http://www.511virginia.org/RoadConditions.aspx?j=All&r=1

В настоящее время я использую BeautifulSoup и код у меня выглядит следующим образом

from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mech = Browser()

url = "http://www.511virginia.org/RoadConditions.aspx?j=All&r=1"
page = mech.open(url)

html = page.read()
soup = BeautifulSoup(html)

table = soup.find("table")

rows = table.findAll('tr')[3]

cols = rows.findAll('td')

roadtype = cols[0].string
start = cols.[1].string
end = cols[2].string
condition = cols[3].string
reason = cols[4].string
update = cols[5].string

entry = (roadtype, start, end, condition, reason, update)

print entry

Проблема с начальным и конечным столбцами. Они просто печатаются как «Нет»

Выход:

(u'Rt. 613N (Giles County)', None, None, u'Moderate', u'snow or ice', u'01/13/2010 10:50 AM')

Я знаю, что они хранятся в списке столбцов, но кажется, что дополнительный тег ссылки испортил синтаксический анализ с оригинальным HTML, похожим на это:

<td headers="road-type" class="ConditionsCellText">Rt. 613N (Giles County)</td>
<td headers="start" class="ConditionsCellText"><a href="conditions.aspx?lat=37.43036753&long=-80.51118005#viewmap">Big Stony Ck Rd; Rt. 635E/W (Giles County)</a></td>
<td headers="end" class="ConditionsCellText"><a href="conditions.aspx?lat=37.43036753&long=-80.51118005#viewmap">Cabin Ln; Rocky Mount Rd; Rt. 721E/W (Giles County)</a></td>
<td headers="condition" class="ConditionsCellText">Moderate</td>
<td headers="reason" class="ConditionsCellText">snow or ice</td>
<td headers="update" class="ConditionsCellText">01/13/2010 10:50 AM</td>

так что должно быть напечатано:

(u'Rt. 613N (Giles County)', u'Big Stony Ck Rd; Rt. 635E/W (Giles County)', u'Cabin Ln; Rocky Mount Rd; Rt. 721E/W (Giles County)', u'Moderate', u'snow or ice', u'01/13/2010 10:50 AM')

Любые предложения или помощь приветствуются, и спасибо заранее.

Ответы [ 2 ]

32 голосов
/ 13 января 2010
start = cols[1].find('a').string

или проще

start = cols[1].a.string

или лучше

start = str(cols[1].find(text=True))

и

entry = [str(x) for x in cols.findAll(text=True)]
2 голосов
/ 18 января 2014

Я пытался воспроизвести вашу ошибку, но исходная HTML-страница была изменена.

Насчет ошибки, у меня возникла похожая проблема, при попытке воспроизвести пример здесь

изменение предлагаемого URL для таблицы в Википедии

Я исправил это перемещение в BeautifulSoup4

from bs4 import BeautifulSoup

и изменение .string на .get_text()

start = cols[1].get_text()

Я не смог протестировать ваш пример (как я уже говорил, я не смог воспроизвести ошибку), но думаю, что это может быть полезно для людей, которые ищут решение этой проблемы.

...