2010-01-13 9 views
17

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

В настоящее время я использую 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 

вопрос с начальный и конечный столбцы. Они просто напечатаны как «None»

Выход:

(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') 

Любые suggesti приветствуется, и спасибо заблаговременно.

+0

Большое спасибо –

+0

Для этого вам не нужно использовать Beautiful Soup. Вы можете использовать python3 htmlparser: https://github.com/schmijos/html-table-parser-python3/blob/master/html_table_parser/parser.py – schmijos

ответ

32
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)] 
+0

Я пошел с методом str (cols ...). Спасибо. –

+21

Добро пожаловать) Было бы хорошо, если бы вы приняли ответ, если сочтете это полезным –

+1

Согласен, @Stephon Tanner PLS вернется и примет это как ответ – Neil

2

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

об ошибке, у меня была аналогичная проблема, пытаясь воспроизвести пример является here

изменения предложенного URL для a Wikipedia Table

Я установил его переезда в BeautifulSoup4

from bs4 import BeautifulSoup 

и изменения .string для .get_text()

start = cols[1].get_text() 

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