WMP Sites

Pandas read_html: Extrahieren von HTML-Tabellen in Python

Lukas Fuchs vor 2 Jahren Datenbanken 3 Min. Lesezeit

HTML-Tabellen in Python extrahieren mit Pandas read_html()

Pandas, eine unverzichtbare Python-Bibliothek für Datenanalyse und -manipulation, bietet eine praktische Methode namens read_html() zum Extrahieren von HTML-Tabellen in Python. Diese Methode bietet eine einfache und effiziente Möglichkeit, Daten aus HTML-Dokumenten zu laden, selbst wenn diese komplex strukturiert sind.

Verwendung von read_html()

Um read_html() zu verwenden, lädst du zunächst die HTML-Datei oder -URL in eine Variable. Dann rufst du read_html() mit dem HTML-Inhalt als Argument auf. Die Methode gibt eine Liste von DataFrames zurück, wobei jeder DataFrame eine Tabelle aus dem HTML-Dokument darstellt.

import pandas as pd

# HTML-Dokument laden
html = pd.read_html('beispiel.html')

# Liste der extrahierten DataFrames drucken
print(html)

Handhabung unvollständiger oder fehlerhafter HTML-Tabellen

Manchmal können HTML-Tabellen unvollständig oder fehlerhaft sein. Um mit solchen Fällen umzugehen, kannst du die folgenden Argumente in read_html() verwenden:

  • header: Gibt die Zeilen an, die als Kopfzeilen verwendet werden sollen.
  • index_col: Gibt die Spalte an, die als Indexspalte verwendet werden soll.
  • keep_default_na: Fügt fehlende Werte in den extrahierten DataFrames ein.
# Unvollständige Tabelle mit benutzerdefinierten Headern und Index
html = pd.read_html('beispiel.html', header=1, index_col=0, keep_default_na=False)

Verarbeitung extrahierter Tabellen

Sobald du HTML-Tabellen extrahiert hast, kannst du sie wie reguläre DataFrames in Pandas manipulieren. Du kannst sie in verschiedene Formate konvertieren, Daten bereinigen und komplexe Operationen durchführen.

# Extrahierte Tabelle in eine CSV-Datei konvertieren
html[0].to_csv('tabelle.csv', index=False)

# Daten in der Tabelle bereinigen
html[0] = html[0].dropna()

Syntax und Argumente von read_html()

Die Pandas-Funktion read_html() dient zum Extrahieren von Tabellendaten aus HTML. Ihre Syntax lautet wie folgt:

def read_html(io, match=".+", header=None, index_col=None, attrs=None, flavor=None, encoding=None, decimal=".", thousands=None, converters=None, keep_default_na=True, na_values=None, skiprows=None) -> list[DataFrame]

Argumente

Hier sind die wichtigsten Argumente von read_html():

  • io: Der Eingabe-Stream oder -String, der die HTML-Tabelle enthält. Kann ein Dateiname (als Zeichenfolge), eine URL oder ein File-ähnliches Objekt sein.
  • match: (Optional) Eine reguläre Ausdruckszeichenfolge (Regex), die die Tabellenelemente angibt, die extrahiert werden sollen. Standardmäßig extrahiert read_html() alle Tabellen.
  • header: (Optional) Die Zeilennummern, die als Tabellenkopfzeilen verwendet werden sollen. Standardmäßig ist header=0, was bedeutet, dass die erste Zeile als Kopfzeile verwendet wird.

Weitere hilfreiche Argumente

  • attrs: (Optional) Ein Wörterbuch mit HTML-Attributen und ihren Werten, um Tabellen zu identifizieren. Beispielsweise {"id": "my-table"}.
  • flavor: (Optional) Die HTML-Parsing-Engine. Standardmäßig ist flavor='bs4', was den Beautiful Soup-Parser verwendet.
  • converters: (Optional) Ein Wörterbuch, das Spaltennamen Funktionen zuordnet, um die Konvertierung von Spaltenwerten zu ermöglichen.

Tipps

  • Wenn deine HTML-Tabelle mehrere Seiten hat, kannst du das Argument skiprows verwenden, um die Anzahl der zu überspringenden Zeilen anzugeben, z. B. skiprows=[1, 2].
  • Wenn deine HTML-Tabelle unvollständig oder fehlerhaft ist, kannst du die Argumente na_values und keep_default_na verwenden, um fehlende Werte zu verarbeiten.
  • Für die Behandlung komplexer HTML-Strukturen kannst du die Argumente match und attrs verwenden, um Tabellenelemente präzise zu identifizieren.

Behandeln unvollständiger oder fehlerhafter HTML-Tabellen

Wenn die extrahierte HTML-Tabelle unvollständig oder fehlerhaft ist, kannst du bestimmte Argumente und Funktionen von read_html() verwenden, um diese Probleme anzugehen.

Fehlende Werte

Manchmal enthalten HTML-Tabellen leere Zellen oder fehlende Werte. Du kannst das Argument keep_default_na=False verwenden, um diese fehlenden Werte als NaN (Not a Number) zu interpretieren. Dies erleichtert die Verarbeitung der Daten in einem späteren Schritt.

Fehlerhafte HTML

Gelegentlich kannst du auf fehlerhafte HTML-Tabellen stoßen, die zu Parsing-Fehlern führen. Das Argument flavor='lxml' kann in solchen Fällen hilfreich sein. Es aktiviert einen robusteren Parser, der HTML-Fehler besser handhaben kann.

Zu wenig Informationen

In manchen Fällen kann eine HTML-Tabelle nicht genügend Informationen enthalten, um alle Spalten eines Pandas DataFrames zu füllen. Du kannst das Argument attrs verwenden, um zusätzliche Informationen aus den HTML-Tabellenelementen abzurufen.

Beispiel

Betrachte das folgende HTML-Fragment mit einer unvollständigen Tabelle:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Alter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>John</td>
      <td>30
    </tr>
    <tr>
      <td>Mary</td>
    </tr>
  </tbody>
</table>

Um diese Tabelle zu extrahieren und die fehlenden Werte als NaN zu interpretieren, kannst du den folgenden Code verwenden:

import pandas as pd

html = '''<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Alter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>John</td>
      <td>30
    </tr>
    <tr>
      <td>Mary</td>
    </tr>
  </tbody>
</table>'''

df = pd.read_html(html, keep_default_na=False)
print(df)

Ausgabe:

   Name  Alter
0  John   30.0
1  Mary    NaN

Verarbeitung extrahierter Tabellen: Konvertieren in DataFrames und Bereinigen von Daten

Nachdem du HTML-Tabellen mit Pandas read_html() extrahiert hast, musst du sie möglicherweise in DataFrames konvertieren und die Daten aufbereiten, um sie für deine Analyse geeignet zu machen.

Tabellen in DataFrames konvertieren

Um eine extrahierte Tabelle in einen DataFrame zu konvertieren, nutze pd.DataFrame(). Du kannst den header-Parameter angeben, um die Headerzeile der Tabelle zu definieren, oder index_col, um eine Spalte als Index für den DataFrame zu verwenden.

import pandas as pd

tables = pd.read_html('url_zur_HTML_Tabelle')
df = pd.DataFrame(tables[0])

Datenbereinigung

Duplikate entfernen:

Duplikate aus dem DataFrame kannst du mit df.drop_duplicates() entfernen.

Fehlende Werte behandeln:

Fehlende Werte sind in HTML-Tabellen üblich. Du kannst sie mit df.dropna() entfernen oder durch einen anderen Wert ersetzen, z. B. mit df.fillna(0).

Spalten umbenennen:

Spaltennamen können aussagekräftiger sein. Verwende df.rename(columns={'alten_name': 'neuer_name'}), um sie umzubenennen.

Datentypen konvertieren:

Überprüfe die Datentypen der Spalten und konvertiere sie gegebenenfalls in den gewünschten Typ. Dies kann mit df['spaltenname'].astype(dtype) geschehen.

Formatierung entfernen:

HTML-Tabellen enthalten oft Formatierungen wie HTML-Tags. Entferne diese mit df['spaltenname'].str.replace('<br>', '').

Zusammenführen mehrerer Tabellen:

Wenn du mehrere Tabellen extrahiert hast, kannst du sie horizontal oder vertikal zusammenführen. Verwende dazu pd.concat() oder pd.merge().

Fortgeschrittene Verwendung: Bearbeitung komplexer HTML-Strukturen

Bei komplexeren HTML-Strukturen musst du möglicherweise zusätzliche Techniken anwenden, um die Tabellen erfolgreich zu extrahieren.

Verschachtelte Tabellen

Verschachtelte Tabellen, bei denen sich Tabellen innerhalb anderer Tabellen befinden, können eine Herausforderung darstellen. Pandas bietet die Option match an, um anzugeben, welche verschachtelte Tabelle extrahiert werden soll.

html = """
<table>
  <tr>
    <td>
      <table>
        ...
      </table>
    </td>
  </tr>
</table>
"""
tabellen = pd.read_html(html, match="table")

Tabelleneigenschaften extrahieren

Neben den Tabellendaten kannst du auch zusätzliche Informationen wie Kopf- und Fußzeileninformationen extrahieren. Verwende hierfür die Argumente header, footer und index_col.

html = """
<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Alter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>John</td>
      <td>30</td>
    </tr>
  </tbody>
</table>
"""
tabellen = pd.read_html(html, header=0, index_col=0)

Tabellen mit unregelmäßigen Strukturen

Für Tabellen mit unregelmäßigen Strukturen, die nicht in das Standardformat passen, kannst du die Bibliothek Beautiful Soup verwenden, die erweiterte Steuermöglichkeiten für die HTML-Analyse bietet.

Tipps für die Handhabung komplexer HTML-Strukturen

  • Verwende den Entwickler-Modus deines Browsers, um die HTML-Struktur zu inspizieren.
  • Nutze reguläre Ausdrücke, um bestimmte Tabellen oder Daten zu extrahieren.
  • Zerlege komplexe HTML-Strukturen in kleinere Teile auf, bevor du sie in Pandas lädst.
  • Verwende benutzerdefinierte Funktionen, um bestimmte HTML-Elemente zu extrahieren und zu verarbeiten.

Tipps zur Optimierung der read_html()-Leistung

Durch die Befolgung einiger Best Practices kannst du die Leistung der read_html()-Funktion von Pandas optimieren:

Minimieren der HTML-Größe

Da read_html() den gesamten HTML-Code parsen muss, ist es wichtig, die Größe der zu parsenden HTML-Datei so gering wie möglich zu halten. Entferne überflüssige Tags, Kommentare und Leerzeichen aus dem HTML-Code.

Verwendung von benutzerdefinierten HTML-Parsern

Pandas verwendet standardmäßig den lxml-Parser zum Parsen von HTML. Wenn du jedoch mit der Leistung von lxml unzufrieden bist, kannst du stattdessen einen anderen HTML-Parser wie BeautifulSoup verwenden.

Angeben des flavor-Arguments

Das flavor-Argument teilt read_html() mit, welchen HTML-Parser es verwenden soll. Wenn du weißt, dass dein HTML einer bestimmten Spezifikation entspricht, kannst du den entsprechenden flavor angeben, z. B. html5lib oder bs4.

Paralleles Parsen

Wenn du mit sehr großen HTML-Dateien arbeitest, kannst du die parallele Verarbeitung aktivieren, indem du das multiprocessing-Argument auf True setzt. Dadurch werden die HTML-Dateien in kleinere Teile aufgeteilt und parallel geparst.

Beschränken der Anzahl der extrahierten Tabellen

Wenn dein HTML-Dokument mehrere Tabellen enthält, kannst du die Anzahl der extrahierten Tabellen durch Angabe des n-Arguments begrenzen. Dadurch wird die Extraktion beschleunigt, indem nur die angegebenen Tabellen verarbeitet werden.

Verwenden von keep_default_na

Wenn du leere Zellen in den extrahierten Tabellen mit NaN füllen möchtest, setze das keep_default_na-Argument auf True. Dies kann die Leistung verbessern, da ansonsten der Standardwert None verwendet wird, was zusätzliche Verarbeitung erfordert.

Caching von HTML-Dateien

Wenn du dieselbe HTML-Datei mehrmals parsen musst, solltest du den gelesenen HTML-Code zwischenspeichern. Dies kann die Leistung erheblich verbessern, indem das wiederholte Parsen des gleichen HTML-Codes vermieden wird.

Fehlerbehebung bei read_html()

Fehlende oder leere DataFrames

Wenn du einen leeren DataFrame erhältst, könnte es sein, dass:

  • Die HTML-Tabelle nicht existiert oder nicht gültig ist.
  • Die index- oder header-Argumente falsch gesetzt sind.
  • Eine Spalte in der HTML-Tabelle den Namen index hat.

Fehlerhafte Daten

Falls die extrahierten Daten ungenau oder falsch sind, überprüfe Folgendes:

  • Zeichensatz: Stelle sicher, dass der Zeichensatz der HTML-Seite mit dem Zeichensatz deines Codes übereinstimmt.
  • Leerzeichen: Entferne übermäßige Leerzeichen oder Tabulatoren aus der HTML-Tabelle, da sie die Datenerkennung stören können.
  • Fehlende Werte: Überprüfe, ob die HTML-Tabelle fehlende Werte enthält, die zu ungültigen Daten führen können.

Leistungsprobleme

Um die Leistung von read_html() zu verbessern:

  • Verwende lxml statt html5lib: lxml ist ein schnellerer HTML-Parser als html5lib.
  • Begrenze die Anzahl der extrahierten Tabellen: Lade nur die Tabellen, die du benötigst.
  • Paralleisiere den Extraktionsprozess: Nutze die nthreads-Option, um die Extraktion auf mehrere Prozessoren zu verteilen.

Parse-Ausnahmen

Falls read_html() eine Parse-Ausnahme auslöst, könnte es sein, dass:

  • Die HTML-Struktur ist ungültig oder beschädigt.
  • Es handelt sich um eine komplexe oder verschachtelte HTML-Tabelle.
  • Es gibt eine JavaScript-Abhängigkeit, die die Tabelle rendert.

Alternativen zu read_html()

Wenn read_html() deine Anforderungen nicht erfüllt, stehen dir alternative Bibliotheken zur Verfügung:

  • lxml.html: Bietet eine umfassende HTML-Parsing-API für die Extraktion komplexer Tabellen.
  • BeautifulSoup: Eine beliebte Bibliothek für HTML-Parsing, die ebenfalls zur Tabellenextraktion verwendet werden kann.
  • html2text: Konvertiert HTML in Text, was eine einfachere Tabellenextraktion ermöglichen kann.

Alternativen zu read_html() für die HTML-Tabellenextraktion

Während Pandas read_html() eine leistungsstarke Option zum Extrahieren von HTML-Tabellen ist, gibt es auch eine Reihe von Alternativen, die du je nach deinen spezifischen Anforderungen in Betracht ziehen kannst.

Beautiful Soup

Beautiful Soup ist eine umfangreiche HTML-Parsing-Bibliothek, die dir detailliertere Kontrolle über die Extraktion von HTML-Elementen gibt. Es ermöglicht dir, selektive Abfragen für HTML-Tags anhand von Attributen, Klassen oder IDs durchzuführen.

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_string, 'html.parser')
table = soup.find('table', {'id': 'example_table'})

Lxml

Lxml ist eine weitere leistungsstarke XML- und HTML-Parsing-Bibliothek, die XPath-Abfragen unterstützt. XPath ist eine Abfragesprache, mit der du komplexe HTML-Strukturen präzise durchsuchen kannst.

from lxml import html

tree = html.fromstring(html_string)
table = tree.xpath('//table[@id="example_table"]')[0]

Scrapy

Scrapy ist ein Web-Crawling-Framework, das speziell zum Extrahieren strukturierter Daten aus Websites entwickelt wurde. Es bietet eine Reihe von Werkzeugen zum Verwalten von Webanforderungen, Webseitenanalysen und Datenextraktion.

import scrapy

class TableExtractorSpider(scrapy.Spider):
    def parse(self, response):
        table = response.xpath('//table[@id="example_table"]')
        return table

Vor- und Nachteile

Jede dieser Alternativen hat ihre eigenen Stärken und Schwächen:

  • Beautiful Soup: Bietet flexible Abfragefunktionen, kann aber langsamer sein als andere Bibliotheken.
  • Lxml: Leistungsstark und XPath-fähig, erfordert jedoch eine steilere Lernkurve.
  • Scrapy: Umfangreich und für das Web-Crawling konzipiert, kann jedoch für einfache Extraktionsaufgaben überdimensioniert sein.

Auswahl der richtigen Alternative

Die Wahl der richtigen Alternative zu read_html() hängt von deinen spezifischen Anforderungen ab. Wenn du nach einer flexiblen und detaillierten Extraktionslösung suchst, sind Beautiful Soup oder Lxml gute Optionen. Wenn du eine dedizierte Web-Crawling-Lösung benötigst, ist Scrapy eine gute Wahl.

Weitere Beiträge

Folge uns

Neue Beiträge

Frontend

CSS Padding: Der Abstand zwischen Elementen verstehen und beherrschen

AUTOR • Jun 23, 2026
DevOps & Deployment

Fehlerbehebung: MIME-Typ text/html nicht ausführbar aufgrund aktivierter strikter MIME-Typ-Überprüfung

AUTOR • Jun 23, 2026
Frontend

HTML Text fett formatieren: So erstellen Sie auffällige Texte im Web

AUTOR • Jun 23, 2026
Frontend

Outlook HTML Signatur einfügen: Schritt-für-Schritt-Anleitung für Desktop, Web und Mobile

AUTOR • Jun 23, 2026
Frontend

Sicher und bequem einloggen: Gladbacher Bank Login ohne Umwege

AUTOR • Jun 23, 2026
Frontend

Anpassung der HTML Button Farbe: Ein Guide für Anfänger mit sofort umsetzbaren Tipps

AUTOR • Jun 23, 2026
Frontend

HTML in Text umwandeln: So machst du Inhalte sauber, lesbar und suchmaschinenfreundlich

AUTOR • Jun 23, 2026
DevOps & Deployment

Vergessenes Root Passwort Rettung für Administratoren: So kommst du schnell wieder rein

AUTOR • Jun 23, 2026
DevOps & Deployment

Unmounten von Linux Geräten: Schritt-für-Schritt Anleitung für sauberes Aushängen von Laufwerken

AUTOR • Jun 23, 2026
Datenbanken

Ubuntu ZFS: Ein umfassender Leitfaden zur Dateisystementwicklung für stabile, schnelle Systeme

AUTOR • Jun 23, 2026
DevOps & Deployment

Oracle Linux: ein leistungsstarkes und zuverlässiges Betriebssystem für die Cloud und darüber hinaus

AUTOR • Jun 23, 2026
DevOps & Deployment

Die zerstörerische Macht von rm -rf: Vorsicht vor dem Löschen von Daten

AUTOR • Jun 23, 2026
JavaScript

Node.js Versionsverwaltung mit nvm: Die Installation sauber aufsetzen und richtig nutzen

AUTOR • Jun 23, 2026
DevOps & Deployment

Linux Dateiverwaltung: Effizientes Öffnen und Zugreifen auf Dateien im Alltag

AUTOR • Jun 23, 2026
DevOps & Deployment

Linux Mailserver Aufbau, Vorteile und Einrichtung für Anfänger: So startest du sauber

AUTOR • Jun 23, 2026
DevOps & Deployment

Beste PDF Reader für Linux: Funktionen, Vergleiche und Auswahlhilfen

AUTOR • Jun 23, 2026
Frontend

HTML Blocksatz, Ausrichtung und Stile für Texte im Web: So setzt du Texte sauber und lesbar um

AUTOR • Jun 22, 2026
Frontend

Die ultimative Anleitung zur Gestaltung von CSS Headern für unvergessliche Websites

AUTOR • Jun 22, 2026
Frontend

Die Anatomie einer HTML-Kopfzeile: Aufbau, Inhalt und Design für mehr Wirkung

AUTOR • Jun 22, 2026
Frameworks & Libraries

Hugo: Das vielseitige Open-Source-Framework für statische Websites, das schnell, flexibel und SEO-stark ist

AUTOR • Jun 22, 2026

Beliebte Beiträge

Frontend

Ein Hoch auf 85 Jahre: Schöne Sprüche zum 85. Geburtstag

AUTOR • May 12, 2025
DevOps & Deployment

VMware Workstation: Kostenloser Download und Anleitung zur Installation

AUTOR • May 06, 2024
API & Webservices

SCP-Befehl: Ein Beispiel für eine sichere Datenübertragung

AUTOR • May 06, 2024
DevOps & Deployment

Linux Festplattenbelegung: Überwachung und Optimierung deines Speicherplatzes

AUTOR • May 06, 2024
DevOps & Deployment

Linux Top-Befehl: Einen Überblick über Systemressourcennutzung erhalten

AUTOR • May 06, 2024
Backend

PHP Array in JSON umwandeln: Schritt-für-Schritt Anleitung

AUTOR • Apr 12, 2025
API & Webservices

WireGuard für Windows: Ein modernes VPN-Protokoll für einfaches und sicheres VPN-Einrichten

AUTOR • May 06, 2024
Datenbanken

MySQL unter Linux: Installation, Konfiguration und Optimierung

AUTOR • May 06, 2024
DevOps & Deployment

Die Macht der Textbearbeitung im Linux-Terminal

AUTOR • May 06, 2024
DevOps & Deployment

Verschieben von Verzeichnissen in Linux: Befehle und Beispiele

AUTOR • May 06, 2024
DevOps & Deployment

systemctl: Der Befehl zum Verwalten von Systemd-Diensten

AUTOR • May 06, 2024
Frontend

Alles, was Sie über die Stable Diffusion Web-Benutzeroberfläche wissen müssen

AUTOR • May 06, 2024
Frontend

Das HTML-Element „sub“: Alles, was Sie wissen müssen

AUTOR • Apr 24, 2024
Frontend

HTML-Schaltflächenfarbe anpassen: Schritt-für-Schritt-Anleitung

AUTOR • Apr 24, 2024
Frontend

HTML-Versionen im Überblick: Aktuelle Version verstehen und nutzen

AUTOR • Apr 24, 2024
Frontend

Ramstein Yard Sales: Fundgrube für Schnäppchenjäger

AUTOR • Apr 24, 2024
Frontend

HTML in GIF umwandeln: So geht's einfach und schnell

AUTOR • Apr 24, 2024
Frontend

Außergewöhnliche Listen erstellen mit HTML-Aufzählungszeichen

AUTOR • Apr 24, 2024
Frontend

HTML-Bild mit Link: Schritt-für-Schritt-Anleitung zum Verlinken von Bildern im Web

AUTOR • Apr 24, 2024
Frontend

Meta Viewport: Optimieren Sie die mobile Web-Erfahrung

AUTOR • Apr 24, 2024