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