Saltar al contenido

¿Cómo obtienes todas las filas de una tabla en particular usando BeautifulSoup?

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 1column 2
value 1value 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *