1. Extracción de datos tabulares
¿Qué tienen en común las tablas y las cebollas? ¡Sí, sí, capas!
Las tablas en HTML representan una especie de equivalente a un pastel
de capas, que consta de elementos
<table>
,
<tr>
(filas),
<th>
(celdas de encabezado) y
<td>
(celdas normales). Cada uno de estos
elementos desempeña su papel en la representación de datos, y para
extraer información de ellos, necesitamos llegar a cada capa
secuencialmente.
¡Práctica, práctica y más práctica!
Empecemos con la siguiente tabla HTML simple:
<table>
<tr>
<th>Nombre</th>
<th>Edad</th>
<th>Ciudad</th>
</tr>
<tr>
<td>Alicia</td>
<td>29</td>
<td>Moscú</td>
</tr>
<tr>
<td>Bob</td>
<td>34</td>
<td>San Petersburgo</td>
</tr>
</table>
Paso 1: Encontrar una tabla en la página
Las tablas en las páginas web se definen con etiquetas HTML
<table>
, y los datos dentro de las tablas
se colocan dentro de etiquetas <tr>
(filas
de la tabla) y <td>
(celdas de datos). En
BeautifulSoup
el método find
ayuda a encontrar la primera
tabla en la página, mientras find_all
permite obtener
todas las tablas si hay varias.
# Encontrar la primera tabla en la página
table = soup.find("table")
Si necesitas extraer una tabla específica, puedes especificar
la búsqueda incluyendo atributos de la tabla, como id
o
class
.
# Buscar una tabla por clase
table = soup.find("table", {"class": "table-class"})
Paso 2: Extracción de datos de la tabla
Una vez cargada, puedes proceder a extraer datos. Los datos en una tabla están organizados por filas, así que un paso lógico sería recorrer las filas de la tabla y extraer datos de cada celda.
Extracción de encabezados
Los encabezados de la tabla generalmente están en la primera fila y
encapsulados en etiquetas <th>
. El uso de
find_all
permite recopilar todos los encabezados en
una lista.
# Extraer encabezados de la primera fila de la tabla
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("Encabezados de la tabla:", headers)
Extracción de filas de datos
Para extraer todas las filas de datos (generalmente encapsuladas en etiquetas
<tr>
, y cada celda en
<td>
) usamos un bucle anidado: primero
encontramos todas las filas <tr>
, y luego
iteramos a través de las celdas <td>
en cada
fila.
# Extracción de todas las filas de datos
data = []
rows = table.find_all("tr")[1:] # Saltar la primera fila con encabezados
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("Datos de la tabla:", data)
Este código recorre cuidadosamente las filas de la tabla y extrae el texto de cada celda. ¿No es un milagro? Por supuesto, todos sabemos que no hay milagros sin la magia de los bucles.
2. Trabajo con listas
Listas — los hermanos mayores de las tablas
En la vida hay solo dos objetos infinitos: tablas y listas.
Las listas se representan con elementos
<ul>
(no numeradas) y
<ol>
(numeradas), y sus elementos
son <li>
. A diferencia de las tablas,
las listas son simples y minimalistas. Esto las hace ideales
para un procesamiento de datos rápido y eficiente.
Extracción de datos de listas
Mira un ejemplo de lista HTML:
<ul>
<li>Manzana</li>
<li>Plátano</li>
<li>Uva</li>
</ul>
Ahora usamos nuestro viejo y querido BeautifulSoup
, para
extraer estos datos:
html = """
<ul>
<li>Manzana</li>
<li>Plátano</li>
<li>Uva</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
¡Eso es todo! Un enfoque simple pero efectivo que puedes aplicar a estructuras más complejas.
3. Ejemplo de extracción y procesamiento de datos tabulares
Para consolidar el conocimiento, intentemos extraer datos de un ejemplo similar en la práctica, pero con una estructura más compleja:
<table id="cursos">
<tr>
<th>Curso</th>
<th>Instructor</th>
</tr>
<tr>
<td>Python para todos</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automatización con Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="tecnologías">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
Para extraer datos de una tabla o una lista, podemos configurar las consultas de la siguiente manera:
html = """
<table id="cursos">
<tr>
<th>Curso</th>
<th>Instructor</th>
</tr>
<tr>
<td>Python para todos</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automatización con Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="tecnologías">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# Extracción de datos de la tabla
course_table = soup.find('table', id='cursos')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# Extracción de datos de la lista
tech_list = soup.find('ul', class_='tecnologías')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
Este script cubre ambos tipos de datos. Nota cómo usamos identificadores y clases para buscar elementos con precisión. En la práctica, podrías enfrentarte a estructuras HTML más complejas, pero el camino sigue siendo el mismo: comenzamos con el nivel superior, desglosamos los elementos y, finalmente, extraemos los datos valiosos.
4. Resumen parcial y errores comunes
Trabajar con tablas y listas en páginas web es como navegar en un laberinto. A veces podemos encontrarnos con datos imperfectos, como celdas vacías o elementos faltantes. En tales casos, es importante verificar que los datos sean correctos y completos. Los errores comunes pueden incluir intentar acceder a elementos que no existen o un uso incorrecto de selectores. Es importante recordar que el HTML puede no ser tan limpio y estructurado como nos gustaría, por lo que siempre debemos considerar el manejo de excepciones y la validación de los datos.
¿Dónde puede ser útil?
Los conocimientos obtenidos en esta lección te ayudarán a extraer y procesar automáticamente datos de múltiples fuentes en línea. Por ejemplo, puedes automatizar la recopilación de datos de tablas de bolsas de valores, configurar el monitoreo de precios en tiendas en línea e incluso realizar análisis periódicos de datos de blogs y sitios de noticias. El dominio de la técnica de extracción de datos de tablas y listas te abre un mundo de posibilidades para la automatización y el análisis de datos.
GO TO FULL VERSION