Pandas pd.read_html() Funktion

Python math 模块Pandas Häufige Funktionen


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

ParameterTypeBeschreibungStandardwert
iostr, Pfadobjekt, dateiähnliches ObjektHTML-Dateipfad, URL oder StringErforderlich
Trefferstr, regexVerwenden Sie reguläre Ausdrücke, um den Textinhalt der Tabelle abzugleichen'.+'
flavorstrParser: 'lxml', 'html5lib', 'bs4'Keine
headerint, list von intZeilennummer, die als Spaltennamen verwendet wirdKeine
index_colint, strSpalte, die als Zeilenindex verwendet wirdKeine
skiprowsint, list, sliceAngegebene Zeilen überspringenKeine
attrsdictHTML-Tag-Attribute, die zum Filtern von Tabellen verwendet werdenKeine
parse_datesbool, listOb Datumsspalten geparst werden sollenFalse

Rückgabewert

  • Rückgabetyp:list von 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

import pandas as pd

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

import pandas as pd

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

h2 class="example">Beispiel
import pandas as pd

# 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

  • Verwendungread_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 Sieattrsodermatchden 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.

Python math 模块Pandas Häufige Funktionen

Andere Erweiterungen