Pandas pd.read_html() Funktion
read_html()Es ist eine Funktion in der pandas-Bibliothek, die zum Parsen von HTML-Tabellen verwendet wird. Sie kann Tabellendaten aus Webseiten oder HTML-Dateien lesen und in einen DataFrame umwandeln.
Tabellendaten in Webseiten sind eine sehr wichtige Datenquelle. Viele öffentliche Datensätze (wie Aktieninformationen, statistische Daten usw.) werden in Form von HTML-Tabellen präsentiert.read_html()VerwendunglxmlundBeautifulSoupdie Bibliothek zum Parsen von HTML, sie kann automatisch alle Tabellen oder angegebene Tabellen von der Seite extrahieren.
Grundlegende Syntax und Parameter
Syntaxformat
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False, thousands=',',
decimal='.', converters=None, ...)
Parameterbeschreibung
| Parameter | Type | Beschreibung | Standardwert |
|---|---|---|---|
| io | str, Pfadobjekt, dateiähnliches Objekt | HTML-Dateipfad, URL oder String | Erforderlich |
| Treffer | str, regex | Verwenden Sie reguläre Ausdrücke, um den Textinhalt der Tabelle abzugleichen | '.+' |
| flavor | str | Parser: 'lxml', 'html5lib', 'bs4' | Keine |
| header | int, list von int | Zeilennummer, die als Spaltennamen verwendet wird | Keine |
| index_col | int, str | Spalte, die als Zeilenindex verwendet wird | Keine |
| skiprows | int, list, slice | Angegebene Zeilen überspringen | Keine |
| attrs | dict | HTML-Tag-Attribute, die zum Filtern von Tabellen verwendet werden | Keine |
| parse_dates | bool, list | Ob Datumsspalten geparst werden sollen | False |
Rückgabewert
- Rückgabetyp:
listvon DataFrames - Gibt eine Liste von DataFrames zurück; die Anzahl der zurückgegebenen DataFrames entspricht der Anzahl der Tabellen auf der Seite.
- Wenn keine passende Tabelle gefunden wird, wird eine leere Liste zurückgegeben.
Beispiele
Anhand der folgenden Beispiele meistern Sie umfassendread_html()die verschiedenen Verwendungsweisen.
Beispiel 1: Eine Tabelle aus einer lokalen HTML-Datei lesen
Erstellen Sie zuerst eine HTML-Datei, die eine Tabelle enthält, und verwenden Sie dannread_html()um sie einzulesen.
Beispiel
# Eine HTML-Datei mit einer Tabelle erstellen
html_content = '''
<title>Tabelle mit Mitarbeiterinformationen</title>
<h1>Pandas pd-read-html()-Funktion</h1>
<table border="1" class="employee-table">
<tr>
<th>Name</th>
<th>Alter</th>
<th>Stadt</th>
<th>Gehalt</th>
</tr>
<tr>
<td>Tom</td>
<td>28</td>
<td>Peking</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>Abteilungsliste</h2>
<table border="1">
<tr>
<th>Abteilung</th>
<th>Mitarbeiterzahl</th>
</tr>
<tr>
<td>Technologieabteilung</td>
<td>50</td>
</tr>
<tr>
<td>Vertriebsabteilung</td>
<td>30</td>
</tr>
</table>
'''
# HTML in eine Datei schreiben
with open('tables.html', 'w', encoding='utf-8') as f:
f.write(html_content)
# Verwende read_html, um alle Tabellen zu lesen
# io: HTML-Dateipfad (erforderlich)
tables = pd.read_html('tables.html')
# Zeige die Leseergebnisse an
print(f"Found {len(tables)} tables")
print()
# Über alle Tabellen iterieren
for i, df in enumerate(tables):
print(f"--- Tabelle {i+1} ---")
print(df)
print()
Erwartete Ausgabe:
共找到 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
Code-Erklärung:
read_html()Gibt eine Liste von DataFrames zurück, wobei jede Tabelle einem DataFrame entspricht.- Standardmäßig werden alle Tabellen gelesen.
- Die erste Zeile wird automatisch als Spaltennamen erkannt (weil es
thTags gibt).
Beispiel 2: Tabellen mit attrs und match filtern
Wenn eine Seite mehrere Tabellen enthält, kannst du Attribut- oder Textabgleich verwenden, um die gewünschten Tabellen herauszufiltern.
Beispiel
# Erstelle eine HTML-Datei mit Attributen
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>Gesamt</td><td>2</td></tr>
</table>
'''
with open('tables_attrs.html', 'w', encoding='utf-8') as f:
f.write(html_with_attrs)
# Beispiel 2a: Verwende attrs, um nach dem id-Attribut zu filtern
# Lies die Tabelle mit id="employees"
tables_by_id = pd.read_html('tables_attrs.html', attrs={'id': 'employees'})
print("Filtern nach id:")
print(tables_by_id[0])
print()
# Beispiel 2b: Verwende attrs, um nach dem class-Attribut zu filtern
# Lies alle Tabellen mit class="data-table"
tables_by_class = pd.read_html('tables_attrs.html', attrs={'class': 'data-table'})
print("Mit class filtern ({} Tabellen gefunden):".format(len(tables_by_class)))
for i, df in enumerate(tables_by_class):
print(f"Tabelle {i+1}:")
print(df)
print()
# Beispiel 2c: Mit match Tabellen filtern, die spezifischen Text enthalten
# match verwendet reguläre Ausdrücke, um Text in Tabellen abzugleichen
tables_by_text = pd.read_html('tables_attrs.html', match='Tom')
print("Tabellen, die den Text 'Tom' enthalten:")
print(tables_by_text[0])
Erwartete Ausgabe:
使用 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
Code-Erklärung:
attrsDer Parameter kann HTML-Tag-Attribute (wie id, class, style usw.) angeben, um Tabellen zu filtern.matchDer Parameter verwendet reguläre Ausdrücke, um den Textinhalt der Tabelle abzugleichen, und gibt Tabellen zurück, die den passenden Text enthalten.- Wenn nur eine Tabelle zurückgegeben wird, können Sie
tables[0]um das erste DataFrame zu erhalten.
Beispiel 3: Kopfzeilen und Indizes behandeln
HTML-Tabellen können komplexe Formate haben, daher müssen Kopfzeilen und Indizes flexibel behandelt werden.
# HTML mit einer komplexen Struktur erstellen
html_complex = '''
<!-- Tabelle ohne Kopfzeile -->
<table id="no_header">
<tr><td>Tom</td><td>28</td></tr>
<tr><td>Jerry</td><td>35</td></tr>
</table>
<!-- Mehrzeilige Kopfzeile -->
<table id="multi_header">
<tr><th>Name</th><th colspan="2">Kontaktinformationen</th></tr>
<tr><th></th><th>Telefon</th><th>E-Mail</th></tr>
<tr><td>Tom</td><td>123456</td><td>tom@example.com</td></tr>
<tr><td>Jerry</td><td>789012</td><td>jerry@example.com</td></tr>
</table>
<!-- Tabelle mit Attributen -->
<table id="with_index" data-type="employee">
<tr><th>Name</th><th>Alter</th><th>Stadt</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)
# Beispiel 3a: Fall ohne Header
# header=None verwendet die erste Zeile nicht als Spaltennamen
df_no_header = pd.read_html('tables_complex.html', attrs={'id': 'no_header'}, header=None)[0]
print("Kein Header:")
print(df_no_header)
print()
# Beispiel 3b: Mehrzeiliger Header
# Zeile 0 und Zeile 1 zusammen als Header verwenden
df_multi_header = pd.read_html('tables_complex.html', attrs={'id': 'multi_header'})[0]
print("Mehrzeiliger Header:")
print(df_multi_header)
print()
# Beispiel 3c: Indexspalte festlegen
# index_col legt Spalte 0 als Index fest
df_with_index = pd.read_html('tables_complex.html', attrs={'id': 'with_index'}, index_col=0)[0]
print("Setting index:")
print(df_with_index)
Erwartete Ausgabe:
没有表头:
0 1
0 Tom 28
1 Jerry 35
多行表头:
姓名 联系方式
NaN 电话 邮箱
0 Tom 123456 tom@example.com
1 Jerry 789012 jerry@example.com
设置索引:
年龄 城市
姓名
Tom 28 Beijing
</空行>
空字符串 NaN NaN
Tom 28 Beijing
Code-Erklärung:
header=NoneSie können die automatische Header-Erkennung deaktivieren und den standardmäßigen Integer-Index als Spaltennamen verwenden.- Mehrzeilige Header werden als MultiIndex verarbeitet.
index_colDer Parameter kann eine Spalte angeben, die als Zeilenindex verwendet werden soll.
Hinweise
- Verwendung
read_html()erfordert Installationlxmldie Bibliothek:pip install lxml。 - Es gibt eine Liste von DataFrames zurück; Sie müssen anhand des Index eine bestimmte Tabelle auswählen.
- Wenn mehrere Tabellen auf der Seite vorhanden sind, verwenden Sie
attrsodermatchden Parameter zum Filtern. read_html()Es wird versuchen, alle Tabellen zu parsen, was langsam sein kann. Bei großen Seiten können Siematchden Parameter verwenden, um den Umfang einzugrenzen.- Das Lesen von Webseiten erfordert Netzwerkunterstützung, und es kann Zugriffsbeschränkungen oder Anti-Crawling-Mechanismen geben.
Zusammenfassung
read_html()Es ist ein leistungsstarkes Werkzeug in pandas zum Lesen von HTML-Tabellendaten. Es kann Tabellen in Webseiten automatisch analysieren und in ein strukturiertes DataFrame-Format umwandeln.
In der praktischen Arbeit, wenn Sie Daten von Webseiten abrufen müssen,read_html()ist es eine sehr praktische Wahl. Die Beherrschung der Verwendung der Parameter attrs und match ermöglicht es Ihnen, die erforderlichen Daten effizient aus komplexen Seiten zu extrahieren. Es wird empfohlen, dass Leser dieser Funktion Priorität einräumen, wenn sie Webtabellen scrapen müssen.
Pandas Häufige Funktionen