Fonction Pandas pd.read_html()
read_html()C'est une fonction de la bibliothèque pandas utilisée pour analyser des tableaux HTML, qui peut lire les données tabulaires à partir de pages web ou de fichiers HTML et les convertir en un DataFrame.
Les données tabulaires dans les pages web sont une source de données très importante. De nombreux jeux de données publics (comme les informations boursières, les données statistiques, etc.) sont présentés sous forme de tableaux HTML.read_html()UtilisationlxmletBeautifulSoupla bibliothèque pour analyser le HTML, elle peut automatiquement extraire tous les tableaux ou les tableaux spécifiés de la page.
Syntaxe de base et paramètres
Format de syntaxe
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False, thousands=',',
decimal='.', converters=None, ...)
Description du paramètre
| Paramètre | Type | Description | Valeur par défaut |
|---|---|---|---|
| io | str, objet chemin, objet de type fichier | chemin de fichier HTML, URL ou chaîne | Requis |
| correspondance | str, regex | Utiliser des expressions régulières pour correspondre au contenu textuel du tableau | '.+' |
| flavor | str | Analyseur : 'lxml', 'html5lib', 'bs4' | Aucune |
| header | int, liste d'int | Numéro de ligne utilisé comme noms de colonnes | Aucune |
| index_col | int, str | Colonne utilisée comme index de ligne | Aucune |
| skiprows | int, list, slice | Ignorer les lignes spécifiées | Aucune |
| attrs | dict | Attributs de balise HTML utilisés pour filtrer les tableaux | Aucune |
| parse_dates | bool, list | Indique s'il faut analyser les colonnes de dates | False |
Valeur de retour
- Type de retour:
listde DataFrames - Renvoie une liste de DataFrames ; le nombre de DataFrames renvoyés correspond au nombre de tableaux de la page.
- Si aucun tableau correspondant n'est trouvé, renvoie une liste vide.
Exemples
À travers les exemples suivants, maîtrisez de manière exhaustiveread_html()les différentes utilisations.
Exemple 1 : Lire un tableau à partir d'un fichier HTML local
Créez d'abord un fichier HTML contenant un tableau, puis utilisezread_html()pour le lire.
Exemple
# Créer un fichier HTML contenant un tableau
html_content = '''
<title>Tableau d'informations sur les employés</title>
<h1>Fonction Pandas pd-read-html()</h1>
<table border="1" class="employee-table">
<tr>
<th>Nom</th>
<th>Âge</th>
<th>Città</th>
<th>Salaire</th>
</tr>
<tr>
<td>Tom</td>
<td>28</td>
<td>Pékin</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>Canton</td>
<td>15000</td>
</tr>
<tr>
<td>Lucy</td>
<td>26</td>
<td>Shenzhen</td>
<td>7000</td>
</tr>
</table>
<h2>Liste des départements</h2>
<table border="1">
<tr>
<th>Département</th>
<th>Effectif</th>
</tr>
<tr>
<td>Département Technologie</td>
<td>50</td>
</tr>
<tr>
<td>Département des ventes</td>
<td>30</td>
</tr>
</table>
'''
# Écrire le HTML dans un fichier
with open('tables.html', 'w', encoding='utf-8') as f:
f.write(html_content)
# Utiliser read_html pour lire tous les tableaux
# io : chemin du fichier HTML (obligatoire)
tables = pd.read_html('tables.html')
# Afficher les résultats de lecture
print(f"{len(tables)} tableaux trouvés")
print()
# Parcourir tous les tableaux
for i, df in enumerate(tables):
print(f"--- Table {i+1} ---")
print(df)
print()
Sortie attendue :
共找到 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
Explication du code :
read_html()Renvoie une liste de DataFrames, chaque tableau correspondant à un DataFrame.- Par défaut, tous les tableaux sont lus.
- La première ligne est automatiquement reconnue comme les noms de colonnes (car il y a des
thbalises).
Exemple 2 : Filtrer les tableaux en utilisant attrs et match
Lorsqu'une page contient plusieurs tableaux, vous pouvez utiliser la correspondance d'attributs ou de texte pour filtrer les tableaux souhaités.
Exemple
# Créer un fichier HTML avec des attributs
html_with_attrs = '''
<table id="employees" class="data-table">
<tr><th>nom</th><th>âge</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>produit</th><th>prix</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)
# Exemple 2a : Utiliser attrs pour filtrer par attribut id
# Lire la table avec id="employees"
tables_by_id = pd.read_html('tables_attrs.html', attrs={'id': 'employees'})
print("Utilisation de l'id pour filtrer :")
print(tables_by_id[0])
print()
# Exemple 2b : Utiliser attrs pour filtrer par attribut class
# Lire toutes les tables avec class="data-table"
tables_by_class = pd.read_html('tables_attrs.html', attrs={'class': 'data-table'})
print("Utilisation de la classe pour filtrer ({} tableaux trouvés) :".format(len(tables_by_class)))
for i, df in enumerate(tables_by_class):
print(f"Tableau {i+1} :")
print(df)
print()
# Exemple 2c : Utiliser match pour filtrer les tableaux contenant un texte spécifique
# match utilise des expressions régulières pour faire correspondre le texte dans les tableaux
tables_by_text = pd.read_html('tables_attrs.html', match='Tom')
print("Tableaux contenant le texte 'Tom' :")
print(tables_by_text[0])
Sortie attendue :
使用 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
Explication du code :
attrsLe paramètre peut spécifier des attributs de balise HTML (tels que id, class, style, etc.) pour filtrer les tableaux.matchLe paramètre utilise des expressions régulières pour faire correspondre le contenu textuel du tableau, renvoyant les tableaux qui contiennent le texte correspondant.- Lorsqu'un seul tableau est retourné, vous pouvez utiliser
tables[0]pour obtenir le premier DataFrame.
Exemple 3: Gérer les en-têtes et les index
Les tableaux HTML peuvent avoir des formats complexes, donc les en-têtes et les index doivent être gérés de manière flexible.
# Créer du HTML avec une structure complexe
html_complex = '''
<!-- Table sans en-tête -->
<table id="no_header">
<tr><td>Tom</td><td>28</td></tr>
<tr><td>Jerry</td><td>35</td></tr>
</table>
<!-- En-tête multiligne -->
<table id="multi_header">
<tr><th>Nom</th><th colspan="2">Informations de contact</th></tr>
<tr><th></th><th>Téléphone</th><th>E-mail</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>
<!-- Tableau avec attributs -->
<table id="with_index" data-type="employee">
<tr><th>Nom</th><th>Âge</th><th>Ville</th></tr>
<tr><th></th><th></th><th></th></tr>
<tr><td>Tom</td><td>28</td><td>Pékin</td></tr>
</table>
'''
with open('tables_complex.html', 'w', encoding='utf-8') as f:
f.write(html_complex)
# Exemple 3a : Cas sans en-tête
# header=None n'utilise pas la première ligne comme noms de colonnes
df_no_header = pd.read_html('tables_complex.html', attrs={'id': 'no_header'}, header=None)[0]
print("Aucun en-tête :")
print(df_no_header)
print()
# Exemple 3b : En-tête multiligne
# Utiliser la ligne 0 et la ligne 1 ensemble comme en-tête
df_multi_header = pd.read_html('tables_complex.html', attrs={'id': 'multi_header'})[0]
print("En-tête multiligne :")
print(df_multi_header)
print()
# Exemple 3c : Définir la colonne d'index
# index_col spécifie la colonne 0 comme index
df_with_index = pd.read_html('tables_complex.html', attrs={'id': 'with_index'}, index_col=0)[0]
print("Définition de l'index :")
print(df_with_index)
Sortie attendue :
没有表头:
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
Explication du code :
header=NoneVous pouvez désactiver la reconnaissance automatique des en-têtes et utiliser l'index entier par défaut comme noms de colonnes.- Les en-têtes multilignes sont traités comme un MultiIndex.
index_colLe paramètre peut spécifier une colonne à utiliser comme index de ligne.
Notes
- Utilisation
read_html()nécessite l'installation delxmlla bibliothèque :pip install lxml。 - Il renvoie une liste de DataFrames ; vous devez sélectionner un tableau spécifique en fonction de l'index.
- Lorsqu'il y a plusieurs tableaux sur la page, utilisez
attrsoumatchle paramètre pour filtrer. read_html()Il tentera d'analyser tous les tableaux, ce qui peut être lent. Pour les pages volumineuses, vous pouvez utilisermatchle paramètre pour restreindre la portée.- La lecture de pages web nécessite un support réseau, et il peut exister des restrictions d'accès ou des mécanismes anti-crawling.
Résumé
read_html()C'est un outil puissant dans pandas pour lire les données de tableaux HTML. Il peut analyser automatiquement les tableaux des pages web et les convertir en un format DataFrame structuré.
Dans le travail pratique, si vous devez obtenir des données à partir de pages web,read_html()c'est un choix très pratique. Maîtriser l'utilisation des paramètres attrs et match vous permet d'extraire efficacement les données requises à partir de pages complexes. Il est recommandé aux lecteurs de donner la priorité à cette fonction lorsqu'ils ont besoin d'extraire des tableaux web.
Fonctions courantes de Pandas