Función Pandas pd.read_html()

Python math 模块Funciones comunes de Pandas


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ámetroTipoDescripciónValor predeterminado
iostr, path object, file-like objectRuta de archivo HTML, URL o cadenaObligatorio
matchstr, regexUtiliza expresiones regulares para hacer coincidir el contenido de texto de la tabla.'.+'
flavorstrAnalizador: 'lxml', 'html5lib', 'bs4'None
headerint, list of intNúmero de fila que se usará como nombres de columna.None
index_colint, strLa columna que se usará como índice de fila.None
skiprowsint, list, sliceSaltar las filas especificadas.None
attrsdictAtributos de etiquetas HTML, utilizados para filtrar tablas.None
parse_datesbool, listSi se analizan las columnas de fecha.False

Valor de retorno

  • Tipo de retorno:list of 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

import pandas as pd

# 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 haythetiquetas).

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

import pandas as pd

# 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 usartables[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.

h2 class="example">Ejemplo
import pandas as pd

# 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 usarread_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, usaattrsomatchel 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.

Python math 模块Funciones comunes de Pandas

Otras extensiones