Si te encuentras con algo que no entiendes puedes comentarlo y te responderemos rápidamente.
Solución:
Esto debería ser bastante sencillo si tiene una parte de HTML para analizar con BeautifulSoup. La idea general es navegar a su mesa usando el findChildren
método, entonces puede obtener el valor del texto dentro de la celda con el string
propiedad.
>>> from BeautifulSoup import BeautifulSoup
>>>
>>> html = """
...
...
...
... column 1 column 2
... value 1 value 2
...
...
...
... """
>>>
>>> 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
>>>
Si alguna vez tiene tablas anidadas (como en los sitios web diseñados a la antigua), el enfoque anterior podría fallar.
Como solución, es posible que desee extraer primero las tablas no anidadas:
html = '''
Top level table cell
Nested table cell
...another nested cell
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
non_nested_tables = [t for t in soup.find_all('table') if not t.find_all('table')]
Alternativamente, si desea extraer el contenido de todas las tablas, incluidas las que anidan en otras tablas, puede extraer solo el contenido de nivel superior. tr
y th
/td
encabezados Para esto, debe desactivar la recursividad al llamar al find_all
método:
soup = BeautifulSoup(html, 'lxml')
tables = soup.find_all('table')
cnt = 0
for my_table in tables:
cnt += 1
print ('=============== TABLE ==============='.format(cnt))
rows = my_table.find_all('tr', recursive=False) # <-- HERE
for row in rows:
cells = row.find_all(['th', 'td'], recursive=False) # <-- HERE
for cell in cells:
# DO SOMETHING
if cell.string: print (cell.string)
Producción:
=============== TABLE 1 ===============
Top level table cell
=============== TABLE 2 ===============
Nested table cell
...another nested cell
Si estás de acuerdo, tienes la opción de dejar una crónica acerca de qué te ha impresionado de este escrito.