Función Pandas pd.read_html()
read_html()Es una función de la biblioteca pandas que se utiliza para analizar tablas HTML, capaz de leer datos de tablas desde páginas web o archivos HTML y convertirlos en DataFrame.
Los datos tabulares en páginas web son una fuente de datos muy importante; muchos datos públicos (como información de acciones, estadísticas, etc.) se presentan en forma de tablas HTML.read_html()UtilizandolxmlyBeautifulSoupla biblioteca para analizar HTML, se pueden extraer automáticamente todas las tablas de la página o tablas específicas.
Sintaxis básica y parámetros
Formato de sintaxis
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False, thousands=',',
decimal='.', converters=None, ...)
Descripción de parámetros
| Parámetro | Tipo | Descripción | Valor predeterminado |
|---|---|---|---|
| io | str, path object, file-like object | Ruta de archivo HTML, URL o cadena | Obligatorio |
| match | str, regex | Utiliza expresiones regulares para hacer coincidir el contenido de texto de la tabla. | '.+' |
| flavor | str | Analizador: 'lxml', 'html5lib', 'bs4' | None |
| header | int, list of int | Número de fila que se usará como nombres de columna. | None |
| index_col | int, str | La columna que se usará como índice de fila. | None |
| skiprows | int, list, slice | Saltar las filas especificadas. | None |
| attrs | dict | Atributos de etiquetas HTML, utilizados para filtrar tablas. | None |
| parse_dates | bool, list | Si se analizan las columnas de fecha. | False |
Valor de retorno
- Tipo de retorno:
listof DataFrames - Devuelve una lista de DataFrames; cuántas tablas haya en la página, tantos DataFrames devuelve.
- Si no se encuentra ninguna tabla que coincida, devuelve una lista vacía.
Ejemplo
A través de los siguientes ejemplos, domina completamenteread_html()los diversos usos.
Ejemplo 1: Leer tablas de un archivo HTML local
Primero crea un archivo HTML que contenga una tabla, y luego usaread_html()para leerlo.
Ejemplo
# Crear un archivo HTML que contenga una tabla
html_content = '''
<title>Tabla de información de empleados</title>
<h1>Función Pandas pd-read-html()</h1>
<table border="1" class="employee-table">
<tr>
<th>Nombre</th>
<th>Edad</th>
<th>Ciudad</th>
<th>Salario</th>
</tr>
<tr>
<td>Tom</td>
<td>28</td>
<td>Beijing</td>
<td>8000</td>
</tr>
<tr>
<td>Jerry</td>
<td>35</td>
<td>Shanghai</td>
<td>12000</td>
</tr>
<tr>
<td>Mike</td>
<td>42</td>
<td>Guangzhou</td>
<td>15000</td>
</tr>
<tr>
<td>Lucy</td>
<td>26</td>
<td>Shenzhen</td>
<td>7000</td>
</tr>
</table>
<h2>Lista de departamentos</h2>
<table border="1">
<tr>
<th>Departamento</th>
<th>Número de personas</th>
</tr>
<tr>
<td>Departamento de Tecnología</td>
<td>50</td>
</tr>
<tr>
<td>Departamento de Ventas</td>
<td>30</td>
</tr>
</table>
'''
# Escribir el HTML en un archivo
with open('tables.html', 'w', encoding='utf-8') as f:
f.write(html_content)
# Usar read_html para leer todas las tablas
# io: ruta del archivo HTML (obligatorio)
tables = pd.read_html('tables.html')
# Ver los resultados de la lectura
print(f"Se encontraron {len(tables)} tablas")
print()
# Recorrer todas las tablas
for i, df in enumerate(tables):
print(f"--- Tabla {i+1} ---")
print(df)
print()
Resultado esperado de la ejecución:
共找到 2 个表格
--- 表格 1 ---
姓名 年龄 城市 薪资
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
2 Mike 42 Guangzhou 15000
3 Lucy 26 Shenzhen 7000
--- 表格 2 ---
部门 人数
0 技术部 50
1 销售部 30
Análisis del código:
read_html()Devuelve una lista de DataFrames; cada tabla corresponde a un DataFrame.- De forma predeterminada, se leen todas las tablas.
- La primera fila se reconoce automáticamente como nombre de columna (porque hay
thetiquetas).
Ejemplo 2: Filtrar tablas usando attrs y match
Cuando la página tiene varias tablas, se pueden usar atributos o coincidencia de texto para filtrar las tablas deseadas.
Ejemplo
# Crear un archivo HTML con atributos
html_with_attrs = '''
<table id="employees" class="data-table">
<tr><th>name</th><th>age</th></tr>
<tr><td>Tom</td><td>28</td></tr>
<tr><td>Jerry</td><td>35</td></tr>
</table>
<table id="products" class="data-table">
<tr><th>product</th><th>price</th></tr>
<tr><td>A</td><td>100</td></tr>
<tr><td>B</td><td>200</td></tr>
</table>
<table class="summary">
<tr><td>Total</td><td>2</td></tr>
</table>
'''
with open('tables_attrs.html', 'w', encoding='utf-8') as f:
f.write(html_with_attrs)
# Ejemplo 2a: Usar attrs para filtrar por el atributo id
# Leer la tabla con id="employees"
tables_by_id = pd.read_html('tables_attrs.html', attrs={'id': 'employees'})
print("Filtrar por id:")
print(tables_by_id[0])
print()
# Ejemplo 2b: Usar attrs para filtrar por el atributo class
# Leer todas las tablas con class="data-table"
tables_by_class = pd.read_html('tables_attrs.html', attrs={'class': 'data-table'})
print("Filtrar por class (se encontraron {} tablas):".format(len(tables_by_class)))
for i, df in enumerate(tables_by_class):
print(f"Tabla {i+1}:")
print(df)
print()
# Ejemplo 2c: Usar match para filtrar tablas que contengan texto específico
# match usa expresiones regulares para hacer coincidir el texto en la tabla
tables_by_text = pd.read_html('tables_attrs.html', match='Tom')
print("Tabla que contiene el texto 'Tom':")
print(tables_by_text[0])
Resultado esperado de la ejecución:
使用 id 筛选: name age 0 Tom 28 1 Jerry 35 使用 class 筛选 (找到 2 个表格): 表格 1: name age 0 Tom 28 1 Jerry 35 表格 2: product price 0 A 100 1 B 200 包含 'Tom' 文本的表格: name age 0 Tom 28 1 Jerry 35
Análisis del código:
attrsEl parámetro attrs puede especificar atributos de etiquetas HTML (como id, class, style, etc.) para filtrar tablas.matchEl parámetro match usa expresiones regulares para hacer coincidir el contenido de texto de la tabla y devuelve las tablas que contienen el texto coincidente.- Cuando solo se devuelve una tabla, se puede usar
tables[0]para obtener el primer DataFrame.
Ejemplo 3: Manejo de encabezados e índices
El formato de las tablas HTML puede ser complejo, por lo que se deben manejar con flexibilidad los encabezados e índices.
# Crear HTML de estructura compleja
html_complex = '''
<!-- Tabla sin encabezado -->
<table id="no_header">
<tr><td>Tom</td><td>28</td></tr>
<tr><td>Jerry</td><td>35</td></tr>
</table>
<!-- Encabezado de varias filas -->
<table id="multi_header">
<tr><th>Nombre</th><th colspan="2">Información de contacto</th></tr>
<tr><th></th><th>Teléfono</th><th>Correo electrónico</th></tr>
<tr><td>Tom</td><td>123456</td><td>[email protected]</td></tr>
<tr><td>Jerry</td><td>789012</td><td>[email protected]</td></tr>
</table>
<!-- Tabla con atributos -->
<table id="with_index" data-type="employee">
<tr><th>Nombre</th><th>Edad</th><th>Ciudad</th></tr>
<tr><th></th><th></th><th></th></tr>
<tr><td>Tom</td><td>28</td><td>Beijing</td></tr>
</table>
'''
with open('tables_complex.html', 'w', encoding='utf-8') as f:
f.write(html_complex)
# Ejemplo 3a: Caso sin encabezado
# header=None no usa la primera fila como nombres de columna
df_no_header = pd.read_html('tables_complex.html', attrs={'id': 'no_header'}, header=None)[0]
print("Sin encabezado:")
print(df_no_header)
print()
# Ejemplo 3b: Encabezado de varias filas
# Usar la fila 0 y la fila 1 juntas como encabezado
df_multi_header = pd.read_html('tables_complex.html', attrs={'id': 'multi_header'})[0]
print("Encabezado de varias filas:")
print(df_multi_header)
print()
# Ejemplo 3c: Establecer la columna de índice
# index_col especifica la columna 0 como índice
df_with_index = pd.read_html('tables_complex.html', attrs={'id': 'with_index'}, index_col=0)[0]
print("Establecer índice:")
print(df_with_index)
Resultado esperado de la ejecución:
没有表头:
0 1
0 Tom 28
1 Jerry 35
多行表头:
姓名 联系方式
NaN 电话 邮箱
0 Tom 123456 [email protected]
1 Jerry 789012 [email protected]
设置索引:
年龄 城市
姓名
Tom 28 Beijing
</空行>
空字符串 NaN NaN
Tom 28 Beijing
Análisis del código:
header=NoneSe puede deshabilitar el reconocimiento automático del encabezado y usar el índice entero predeterminado como nombres de columna.- Los encabezados de varias filas se procesan como índice de varios niveles (MultiIndex).
index_colEl parámetro index_col puede especificar una columna como índice de fila.
Notas
- Para usar
read_html()se necesita instalarlxmlla biblioteca:pip install lxml。 - Lo que se devuelve es una lista de DataFrames; es necesario seleccionar la tabla específica según el índice.
- Cuando hay varias tablas en la página, usa
attrsomatchel parámetro para filtrar. read_html()Intentará analizar todas las tablas, lo que puede ser lento; para páginas grandes se puede usarmatchel parámetro para reducir el alcance.- Leer páginas web requiere soporte de red; pueden existir restricciones de acceso o mecanismos anti-rastreo.
Resumen
read_html()Es una potente herramienta de pandas para leer datos de tablas HTML. Puede analizar automáticamente las tablas de una página web y convertirlas en un DataFrame estructurado.
En la práctica, si necesitas obtener datos de páginas web,read_html()es una opción muy práctica. Dominar el uso de los parámetros attrs y match permite extraer de manera eficiente los datos deseados de páginas complejas. Se recomienda al lector considerar esta función como primera opción cuando necesite extraer tablas de páginas web.
Funciones comunes de Pandas