Pytanie Parsowanie tabeli HTML BeautifulSoup


Próbuję parsować informacje (tabele html) z tej strony: http://www.511virginia.org/RoadConditions.aspx?j=All&r=1

Obecnie używam BeautifulSoup i kod, który wyglądam w ten sposób

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

Problem dotyczy kolumn początkowych i końcowych. Po prostu są drukowane jako "Brak"

Wydajność:

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

Wiem, że są one przechowywane na liście kolumn, ale wydaje się, że dodatkowy znacznik łącza psuje proces z oryginalnym html wyglądającym tak:

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

więc to, co powinno zostać wydrukowane, to:

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

Wszelkie sugestie i pomoc są doceniane i dziękuję z góry.


17
2018-01-13 18:50


pochodzenie


Dziękuję bardzo - Haider Ali
Nie musisz używać do tego Pięknej Zupy. Możesz użyć python3 htmlparser: github.com/schmijos/html-table-parser-python3/blob/master/... - schmijos


Odpowiedzi:


start = cols[1].find('a').string

lub prostsze

start = cols[1].a.string

albo lepiej

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

i

entry = [str(x) for x in cols.findAll(text=True)]

32
2018-01-13 18:56



Poszedłem z metodą str (cols ...). Dziękuję Ci. - Stephen Tanner
Witamy) Byłoby dobrze, gdybyś przyjął odpowiedź, jeśli uzna to za pomocne - Antony Hatchkins
Zgadzam się, @Stephon Tanner pls wróć i zaakceptuj to jako odpowiedź - Neil


Próbowałem odtworzyć błąd, ale źródłowa strona HTML została zmieniona.

O błędzie, miałem podobny problem, próbując odtworzyć przykład tutaj

zmiana proponowanego adresu URL dla Tablica Wikipedii

Naprawiłem to w ruchu do BeautifulSoup4

from bs4 import BeautifulSoup

i zmieniając .string dla .get_text()

start = cols[1].get_text()

Nie mogłem przetestować na twoim przykładzie (jak już wcześniej wspomniałem, nie mogłem odtworzyć błędu), ale myślę, że mogłoby to być użyteczne dla ludzi szukających rozwiązania tego problemu.


2
2018-01-18 14:05