2010-01-13 25 views
17

Estoy tratando de analizar la información (tablas html) desde este sitio: http://www.511virginia.org/RoadConditions.aspx?j=All&r=1BeautifulSoup análisis de HTML en la tabla

Actualmente estoy usando BeautifulSoup y el código que tengo es similar al siguiente

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 

El problema es con las columnas de inicio y fin. Ellos sólo se imprimen como "None"

Salida:

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

sé que se almacenan en la lista de columnas, pero parece que la etiqueta de enlace extra se arruinando el análisis con el HTML original mirando de esta manera:

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

así que lo que debe ser impresa es:

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

Cualquier suggesti ons o ayuda es apreciada, y gracias de antemano.

+0

Muchas gracias –

+0

No tiene que usar Beautiful Soup para eso. Podría usar python3 htmlparser: https://github.com/schmijos/html-table-parser-python3/blob/master/html_table_parser/parser.py – schmijos

Respuesta

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

o simple

start = cols[1].a.string 

o mejor

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

y

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

Fui con el método str (cols ...). Gracias. –

+21

Bienvenido) Sería bueno si aceptaras una respuesta si la encuentras útil –

+1

Estoy de acuerdo, @Stephon Tanner pls regresa y acepto esto como una respuesta – Neil

2

yo estaba tratando de reproducir el error, pero la página HTML fuente fue cambiada.

Sobre el error, he tenido un problema similar, tratando de reproducir el ejemplo se here

cambiar la URL propuesto para a Wikipedia Table

me fijo en movimiento a BeautifulSoup4

from bs4 import BeautifulSoup 

y cambiando el .string para .get_text()

start = cols[1].get_text() 

No pude probar con su ejemplo (como dije antes, no pude reproducir el error) pero creo que podría ser útil para las personas que buscan una solución a este problema.

Cuestiones relacionadas