Pandas Lire les tableaux HTML

La méthode de Pandaspd.read_html()La fonction peut analyser automatiquement les données des tableaux HTML dans les pages web et les convertir en DataFrame. Cela est très utile dans des scénarios tels que le scraping web, l'analyse des cours boursiers et l'obtention d'informations financières.


Utilisation de base

read_html()La fonction trouve et lit tous les éléments de tableau HTML dans une page web, en renvoyant une liste de DataFrame.

Lire un seul tableau

Exemple

import pandas as pd

# Lire tous les tableaux de la page web
# Remarque : nécessite les bibliothèques lxml et beautifulsoup4
# pip install lxml beautifulsoup4

# Lire depuis l'URL
tables = pd.read_html("https://example.com/table.html")

# Vérifier le nombre de tableaux trouvés
print(f"{len(tables)} tableaux trouvés")

# Obtenir le premier tableau
df = tables[0]
print(df.head())

Lire plusieurs tableaux

Une page web peut contenir plusieurs tableaux.read_html()Renvoie une liste, qui peut être sélectionnée par index :

Exemple

import pandas as pd

# Supposons que la page web contienne plusieurs tableaux
tables = pd.read_html("https://example.com/data.html")

# Parcourir tous les tableaux
for i, table in enumerate(tables):
    print(f"\n=== Tableau {i+1} ===)
    print(f"Forme : {table.shape}")
    print(table.head(3))

Explication détaillée des paramètres courants

Paramètre Description Exemple
io Source d'entrée, peut être une URL, un chemin de fichier ou une chaîne "page.html"
match Correspondance regex, filtrer les tableaux contenant un texte spécifique match="销售额"
header Spécifier l'index de la ligne d'en-tête header=0
attrs Filtrer les tableaux par attributs HTML attrs={"id": "table1"}
skiprows Ignorer les lignes spécifiées skiprows=[0, 1]
na_values Spécifier les chaînes traitées comme valeurs manquantes na_values=["N/A"]

Utiliser le paramètre match pour filtrer les tables

Exemple

import pandas as pd

# Utiliser le paramètre match pour ne retourner que les tables contenant un texte spécifique
# Par exemple : ne lire que les tables contenant le mot "stock"
tables = pd.read_html(
    "https://example.com/finance.html",
    match="stock"
)

if tables:
    df = tables[0]
    print(df)

Utiliser le paramètre attrs pour localiser précisément les tables

Exemple

import pandas as pd

# Localiser les tables via les attributs HTML
# Par exemple : obtenir la table avec id="stock-table"
tables = pd.read_html(
    "https://example.com/data.html",
    attrs={"id": "stock-table"}  # Trouver l'élément de tableau avec id="stock-table"
)

# Ou localiser par classe
tables = pd.read_html(
    "https://example.com/data.html",
    attrs={"class": "data-table"}
)

df = tables[0]
print(df)

Exemple pratique : extraction de données boursières depuis une page Web

L'exemple suivant montre comment extraire les données d'une liste d'actions depuis un site web financier :

Exemple

import pandas as pd
from io import StringIO


# Créer un contenu HTML factice pour la démonstration
# Remplacer par une URL réelle en conditions réelles
html_content = '''
<table border="1">
    <tr>
<th>Code de l'action</th>
<th>Nom de l'action</th>
<th>Cours de clôture</th>
<th>Pourcentage de variation</th>
    </tr>
    <tr>
        <td>600519</td>
<td>Kweichow Moutai</td>
        <td>1850.00</td>
        <td>2.35%</td>
    </tr>
    <tr>
        <td>000858</td>
<td>Wuliangye</td>
        <td>185.50</td>
        <td>-1.20%</td>
    </tr>
    <tr>
        <td>601318</td>
<td>Ping An de Chine</td>
        <td>52.30</td>
        <td>0.85%</td>
    </tr>
</table>
'''


# Lire un tableau à partir d'une chaîne

tables = pd.read_html(StringIO(html_content))

df = tables[0]

print("Tableau d'origine :")
print(df)
print()

# Nettoyage des données : traiter la colonne du pourcentage de variation
df["Change Percent"] = df["Change Percent"].str.replace("%", "").astype(float)
df["Closing Price"] = df["Closing Price"].astype(float)

print("Données nettoyées :")
print(df)

Le rôle de StringIO est de déguiser une chaîne en objet fichier, afin que pandas la traite selon la logique de lecture d'un flux de fichier plutôt que de la confondre avec un chemin ou une URL.

Sortie :

原始表格:
     股票代码  股票名称     收盘价     涨跌幅
0  600519  贵州茅台  1850.0   2.35%
1     858   五粮液   185.5  -1.20%
2  601318  中国平安    52.3   0.85%

清洗后的数据:
     股票代码  股票名称     收盘价   涨跌幅
0  600519  贵州茅台  1850.0  2.35
1     858   五粮液   185.5 -1.20
2  601318  中国平安    52.3  0.85

Lire les tableaux de Wikipédia

Exemple

import pandas as pd

# Lire des tableaux depuis une page Wikipédia
# En utilisant la liste des pays par population comme exemple
url = "https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations)"

try:
    tables = pd.read_html(url)
    print(f"Cette page contient {len(tables)} tableaux au total")

    # En général, le premier tableau est celui dont nous avons besoin
    df = tables[0]
    print(df.head(10))
except Exception as e:
    print(f"Échec de la lecture : {e}")
    print("Veuillez vous assurer que les bibliothèques nécessaires sont installées : pip install lxml beautifulsoup4")

Nettoyage et traitement des données

Les tableaux lus à partir de pages web nécessitent généralement un nettoyage supplémentaire avant de pouvoir être utilisés pour l'analyse.

Opérations de nettoyage courantes

Exemple

import pandas as pd
from io import StringIO

# Simuler un tableau contenant diverses données sales
html_content = '''
<table>
<tr><th>Date</th><th>Produit</th><th>Ventes</th><th>Remarques</th></tr>
<tr><td>2024-01-01</td><td>Produit A</td><td>1,234</td><td>N/A</td></tr>
<tr><td>2024-01-02</td><td>Produit B</td><td>567</td><td>Rupture de stock</td></tr>
<tr><td>2024-01-03</td><td>Produit C</td><td>--</td><td>Non compté</td></tr>
</table>
'''


df = pd.read_html(StringIO(html_content))[0]
print("Données d'origine :")
print(df)
print()

# Étapes de nettoyage
# 1. Renommer les colonnes
df.columns = ["Date", "Product", "Sales", "Remarks"]

# 2. Gérer les valeurs manquantes
df = df.replace(["N/A", "--", "Non compté", "Rupture de stock"], pd.NA)

# 3. Nettoyer les colonnes numériques (supprimer les virgules)
df["Sales"] = df["Sales"].str.replace(",", "").replace(pd.NA, None)
df["Sales"] = pd.to_numeric(df["Sales"], errors="coerce")

# 4. Convertir les dates
df["Date"] = pd.to_datetime(df["Date"])

print("Après nettoyage :")
print(df)
print("\n"Types de données :")
print(df.dtypes)

Sortie :

原始数据:
           日期   产品    销量   备注
0  2024-01-01  产品A  1234  NaN
1  2024-01-02  产品B   567   缺货
2  2024-01-03  产品C    --  未统计

清洗后:
          日期   产品      销量    备注
0 2024-01-01  产品A  1234.0   NaN
1 2024-01-02  产品B   567.0  <NA>
2 2024-01-03  产品C     NaN  <NA>

数据类型:
日期    datetime64[ns]
产品            object
销量           float64
备注            object
dtype: object

Notes et problèmes courants

1. Installer les bibliothèques de dépendances

read_html()Requislxmletbeautifulsoup4bibliothèques :

pip install lxml beautifulsoup4

2. Problèmes réseau

Lors de la lecture d'une URL réseau, vous pouvez rencontrer une latence réseau ou des restrictions d'accès. Il est recommandé d'ajouter des paramètres de délai d'attente appropriés ou d'utiliser une mise en cache locale.

3. Structure de tableau complexe

Certains tableaux de pages web utilisent des structures complexes telles que des cellules fusionnées et des tableaux imbriqués, ce qui peut entraîner des échecs d'analyse. Dans ce cas, vous pouvez essayer d'utiliser BeautifulSoup pour analyser directement le HTML.

4. Intégrité des données

Les données des pages web peuvent changer à tout moment. Il est recommandé de vérifier l'intégrité des données après la lecture et de les comparer avec la source de données d'origine.

Lors de l'extraction de données web, veuillez respecter les règles robots.txt du site web ainsi que les lois et réglementations pertinentes, et ne faites pas de requêtes fréquentes pour éviter de surcharger le serveur.


Résumé

pd.read_html()C'est un outil puissant pour extraire des données de tableaux web, convertissant rapidement les tableaux HTML en DataFrames. Dans l'utilisation réelle, vous devez faire attention à l'installation des bibliothèques de dépendances, à la gestion des problèmes de réseau, au nettoyage des données sales et à d'autres problèmes. Les données extraites nécessitent généralement un traitement ultérieur avant de pouvoir être utilisées pour l'analyse. Il est recommandé de l'utiliser conjointement avec les fonctionnalités de nettoyage de données de Pandas.

Autres extensions