2010-01-06 7 views
14

Estoy aprendiendo Python y BeautifulSoup para raspar datos de la web y leer una tabla HTML. Puedo leerlo en Open Office y dice que es la Tabla # 11.¿Cómo se obtienen todas las filas de una tabla particular usando BeautifulSoup?

Parece que BeautifulSoup es la opción preferida, pero ¿alguien puede decirme cómo agarrar una mesa en particular y todas las filas? He revisado la documentación del módulo, pero no puedo entenderlo. Muchos de los ejemplos que he encontrado en línea parecen hacer más de lo que necesito.

Respuesta

24

Esto debería ser bastante directo si tienes un trozo de HTML para analizar con BeautifulSoup. La idea general es navegar a su tabla utilizando el método findChildren, luego puede obtener el valor del texto dentro de la celda con la propiedad 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

Ese fue el truco! El código funcionó y debería poder modificarlo según sea necesario. Muchas gracias. Una última pregunta. Puedo seguir el código excepto cuando busca en la tabla niños th y tr. ¿Es eso simplemente buscar en mi tabla y devolver tanto el encabezado de la tabla como las filas de la tabla? Si solo quisiera las filas de la tabla, ¿podría simplemente buscar tr solo? muchas gracias de nuevo! – Btibert3

+2

Sí, '.findChildren (['th', 'tr'])' está buscando elementos con tipo de etiqueta de 'th' o' tr'. Si solo quieres encontrar elementos 'tr' deberías usar' .findChildren ('tr') '(nótese una lista, solo la cadena) –

+0

También vale la pena tener en cuenta que [PyQuery] (https://pythonhosted.org /pyquery/api.html) es una muy buena alternativa a BeautifulSoup. –

Cuestiones relacionadas