Pandas HTML-Tabellen lesen
Pandas'pd.read_html()Die Funktion kann HTML-Tabellendaten auf Webseiten automatisch parsen und in einen DataFrame umwandeln. Dies ist in Szenarien wie Web Scraping, Aktienkursanalyse und dem Abrufen von Finanzinformationen sehr nützlich.
Grundlegende Verwendung
read_html()Die Funktion findet und liest alle HTML-Tabellenelemente auf einer Webseite und gibt eine Liste von DataFrames zurück.
Eine einzelne Tabelle lesen
Beispiel
# Alle Tabellen auf der Webseite lesen
# Hinweis: Erfordert die Bibliotheken lxml und beautifulsoup4
# pip install lxml beautifulsoup4
# Von URL lesen
tables = pd.read_html("https://example.com/table.html")
# Anzahl der gefundenen Tabellen prüfen
print(f"Found {len(tables)} tables")
# Die erste Tabelle abrufen
df = tables[0]
print(df.head())
Mehrere Tabellen lesen
Eine Webseite kann mehrere Tabellen enthalten.read_html()Gibt eine Liste zurück, die über den Index ausgewählt werden kann:
Beispiel
# Angenommen, die Webseite hat mehrere Tabellen
tables = pd.read_html("https://example.com/data.html")
# Über alle Tabellen iterieren
for i, table in enumerate(tables):
print(f"\n=== Tabelle {i+1} ===)
print(f"Form: {table.shape}")
print(table.head(3))
Detaillierte Erklärung allgemeiner Parameter
| Parameter | Beschreibung | Beispiel |
|---|---|---|
io |
Eingabequelle, kann eine URL, ein Dateipfad oder ein String sein | "page.html" |
match |
Regex-Abgleich, filtert Tabellen, die bestimmten Text enthalten | match="销售额" |
header |
Index der Kopfzeile angeben | header=0 |
attrs |
Tabellen nach HTML-Attributen filtern | attrs={"id": "table1"} |
skiprows |
Angegebene Zeilen überspringen | skiprows=[0, 1] |
na_values |
Zeichenfolgen angeben, die als fehlende Werte behandelt werden | na_values=["N/A"] |
Verwenden Sie den Parameter match, um Tabellen zu filtern
Beispiel
# Verwenden Sie den Parameter match, um nur Tabellen zurückzugeben, die bestimmten Text enthalten
# Zum Beispiel: nur Tabellen lesen, die das Wort "stock" enthalten
tables = pd.read_html(
"https://example.com/finance.html",
match="stock"
)
if tables:
df = tables[0]
print(df)
Verwenden Sie den Parameter attrs, um Tabellen präzise zu lokalisieren
Beispiel
# Tabellen über HTML-Attribute lokalisieren
# Zum Beispiel: die Tabelle mit id="stock-table" abrufen
tables = pd.read_html(
"https://example.com/data.html",
attrs={"id": "stock-table"} # Finde das Tabellenelement mit id="stock-table"
)
# Oder anhand der Klasse lokalisieren
tables = pd.read_html(
"https://example.com/data.html",
attrs={"class": "data-table"}
)
df = tables[0]
print(df)
Praktisches Beispiel: Aktiendaten von einer Webseite scrapen
Das folgende Beispiel zeigt, wie man Aktienlistendaten von einer Finanzwebsite scrapt:
Beispiel
from io import StringIO
# Mock-HTML-Inhalt zur Demonstration erstellen
# Bei tatsächlicher Verwendung durch eine echte URL ersetzen
html_content = '''
<table border="1">
<tr>
<th>Aktiencode</th>
<th>Aktienname</th>
<th>Schlusskurs</th>
<th>Veränderung in Prozent</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 of China</td>
<td>52.30</td>
<td>0.85%</td>
</tr>
</table>
'''
# Tabelle aus String lesen
tables = pd.read_html(StringIO(html_content))
df = tables[0]
print("Originaltabelle:")
print(df)
print()
# Datenbereinigung: Verarbeitung der Spalte "Change Percent"
df["Change Percent"] = df["Change Percent"].str.replace("%", "").astype(float)
df["Closing Price"] = df["Closing Price"].astype(float)
print("Bereinigte Daten:")
print(df)
Die Rolle von StringIO besteht darin, eine Zeichenkette als Dateiobjekt zu tarnen, sodass pandas sie nach der Logik des Lesens eines Dateistreams verarbeitet, statt sie für einen Pfad oder eine URL zu halten.
Ausgabe:
原始表格:
股票代码 股票名称 收盘价 涨跌幅
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
Wikipedia-Tabellen lesen
Beispiel
# Tabellen aus einer Wikipedia-Seite lesen
# Verwendung der Liste der Länder nach Bevölkerung als Beispiel
url = "https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations)"
try:
tables = pd.read_html(url)
print(f"Diese Seite hat insgesamt {len(tables)} Tabellen")
# Normalerweise ist die erste Tabelle die, die wir benötigen
df = tables[0]
print(df.head(10))
except Exception as e:
print(f"Lesen fehlgeschlagen: {e}")
print("Bitte stellen Sie sicher, dass die erforderlichen Bibliotheken installiert sind: pip install lxml beautifulsoup4")
Datenbereinigung und -verarbeitung
Aus Webseiten gelesene Tabellen müssen normalerweise weiter bereinigt werden, bevor sie für die Analyse verwendet werden können.
Häufige Bereinigungsoperationen
Beispiel
from io import StringIO
# Simuliere eine Tabelle mit verschiedenen unsauberen Daten
html_content = '''
<table>
<tr><th>Datum</th><th>Produkt</th><th>Verkäufe</th><th>Bemerkungen</th></tr>
<tr><td>2024-01-01</td><td>Produkt A</td><td>1,234</td><td>N/A</td></tr>
<tr><td>2024-01-02</td><td>Produkt B</td><td>567</td><td>Nicht auf Lager</td></tr>
<tr><td>2024-01-03</td><td>Produkt C</td><td>--</td><td>Nicht gezählt</td></tr>
</table>
'''
df = pd.read_html(StringIO(html_content))[0]
print("Originaldaten:")
print(df)
print()
# Bereinigungsschritte
# 1. Spalten umbenennen
df.columns = ["Datum", "Produkt", "Verkäufe", "Bemerkungen"]
# 2. Fehlende Werte behandeln
df = df.replace(["N/A", "--", "Nicht gezählt", "Nicht auf Lager"], pd.NA)
# 3. Numerische Spalten bereinigen (Kommas entfernen)
df["Sales"] = df["Sales"].str.replace(",", "").replace(pd.NA, None)
df["Sales"] = pd.to_numeric(df["Sales"], errors="coerce")
# 4. Datumsangaben konvertieren
df["Date"] = pd.to_datetime(df["Date"])
print("Nach der Bereinigung:")
print(df)
print("\n"Datentypen:")
print(df.dtypes)
Ausgabe:
原始数据:
日期 产品 销量 备注
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
Hinweise und häufige Probleme
1. Abhängigkeitsbibliotheken installieren
read_html()Erforderlichlxmlundbeautifulsoup4Bibliotheken:
pip install lxml beautifulsoup4
2. Netzwerkprobleme
Beim Lesen einer Netzwerk-URL können Netzwerklatenz oder Zugriffsbeschränkungen auftreten. Es wird empfohlen, geeignete Timeout-Einstellungen hinzuzufügen oder lokales Caching zu verwenden.
3. Komplexe Tabellenstruktur
Einige Webseitentabellen verwenden komplexe Strukturen wie verbundene Zellen und verschachtelte Tabellen, was zu Parsing-Fehlern führen kann. In diesem Fall können Sie versuchen, BeautifulSoup zu verwenden, um das HTML direkt zu parsen.
4. Datenintegrität
Webseitendaten können sich jederzeit ändern. Es wird empfohlen, die Datenintegrität nach dem Einlesen zu überprüfen und sie mit der ursprünglichen Datenquelle zu vergleichen.
Beim Scrapen von Webdaten beachten Sie bitte die robots.txt-Regeln der Website sowie relevante Gesetze und Vorschriften und stellen Sie keine häufigen Anfragen, um den Server nicht zu belasten.
Zusammenfassung
pd.read_html()Es ist ein leistungsstarkes Tool zum Scrapen von Webtabellendaten, das HTML-Tabellen schnell in DataFrames umwandelt. Bei der tatsächlichen Verwendung müssen Sie auf die Installation von Abhängigkeitsbibliotheken, die Behandlung von Netzwerkproblemen, die Bereinigung schmutziger Daten und andere Probleme achten. Gescrapte Daten müssen in der Regel weiter verarbeitet werden, bevor sie für die Analyse verwendet werden können. Es wird empfohlen, es zusammen mit den Datenbereinigungsfunktionen von Pandas zu verwenden.