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

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd
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

import pandas as pd

# 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

import pandas as pd
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.

Andere Erweiterungen