DEV Community

Cover image for Von der Web-Tabelle zum Pandas DataFrame in 30 Sekunden
circobit
circobit

Posted on

Von der Web-Tabelle zum Pandas DataFrame in 30 Sekunden

Du hast den perfekten Datensatz gefunden. Er sitzt direkt da auf einer Webseite, sauber formatiert in einer HTML-Tabelle. Du musst ihn nur in Pandas bekommen.

Wie schwer kann das sein?

Der Einzeiler (wenn er funktioniert)

Pandas hat eine eingebaute Funktion dafür:

import pandas as pd

tables = pd.read_html('https://example.com/seite-mit-tabelle')
df = tables[0]  # Erste Tabelle auf der Seite
Enter fullscreen mode Exit fullscreen mode

Das ist wunderbar, wenn es funktioniert. Drei Zeilen, fertig.

Aber hier ist, was die Tutorials dir nicht sagen: pd.read_html() scheitert bei einer überraschend großen Zahl realer Websites.

JavaScript-gerenderte Tabellen? Pandas kann sie nicht sehen. Es liest nur das rohe HTML.

Tabellen, die Authentifizierung erfordern? Da musst du erst Sessions und Cookies handeln.

Komplex verschachtelte Strukturen? Das Parsen kann Müll produzieren.

Anti-Scraping-Maßnahmen? Du wirst blockiert oder bekommst anderen Content serviert.

Für einfache, statische HTML-Tabellen auf öffentlichen Seiten ist pd.read_html() großartig. Für alles andere brauchst du Alternativen.

Der Requests + BeautifulSoup-Ansatz

Wenn pd.read_html() scheitert, ist der nächste Schritt meistens:

import requests
from bs4 import BeautifulSoup
import pandas as pd

response = requests.get('https://example.com/seite')
soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table', {'class': 'data-table'})

# Header extrahieren
headers = [th.text.strip() for th in table.find_all('th')]

# Zeilen extrahieren
rows = []
for tr in table.find_all('tr')[1:]:
    row = [td.text.strip() for td in tr.find_all('td')]
    if row:
        rows.append(row)

df = pd.DataFrame(rows, columns=headers)
Enter fullscreen mode Exit fullscreen mode

Das gibt dir mehr Kontrolle. Du kannst bestimmte Tabellen gezielt ansprechen, Edge Cases behandeln, Daten während der Extraktion bereinigen.

Die Nachteile:

  • Mehr Code zum Schreiben und Warten
  • Kann immer noch kein JavaScript-gerendertes Content verarbeiten
  • Bricht, wenn sich die Website-Struktur ändert

Die Selenium-Nuklearoption

Für JavaScript-lastige Seiten:

from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd

driver = webdriver.Chrome()
driver.get('https://example.com/seite')

# Warten, bis JavaScript gerendert hat
import time
time.sleep(3)

# Jetzt das gerenderte HTML parsen
table = driver.find_element(By.CSS_SELECTOR, 'table.data-table')
# ... Extraktionslogik ähnlich wie bei BeautifulSoup

driver.quit()
Enter fullscreen mode Exit fullscreen mode

Das funktioniert bei fast allem. Der Browser rendert die Seite komplett, JavaScript und alles, dann extrahierst du die Daten.

Der Preis:

  • Langsam (Sekunden pro Seite statt Millisekunden)
  • Browser-Driver-Setup erforderlich
  • Ressourcenhungrig
  • Fühlt sich nach Overkill an, um eine Tabelle zu greifen

Der faule Weg (mein Favorit)

Hier ist, was ich tatsächlich meistens mache:

  1. Seite im Browser öffnen
  2. Tabelle mit einer Browser-Erweiterung als CSV exportieren
  3. In Pandas laden:
df = pd.read_csv('exportierte_tabelle.csv')
Enter fullscreen mode Exit fullscreen mode

Fertig. Kein Scraping-Code. Kein Debuggen von HTML-Selektoren. Kein Umgang mit Edge Cases in Python.

Der Browser hat das JavaScript bereits gerendert. Die Browser-Erweiterung übernimmt das HTML-Parsen und die Datenbereinigung. Ich bekomme eine saubere CSV-Datei, die Pandas ohne Probleme liest.

Ich nutze dafür HTML Table Exporter: Es erkennt Tabellen automatisch und exportiert mit einem Klick als CSV, JSON oder Excel. Läuft lokal, keine Daten werden irgendwohin hochgeladen.

Für weitere Details zu Export-Workflows, siehe die besten Chrome-Erweiterungen zum Exportieren von Tabellen.

Es gibt aber auch andere Tools. Der Punkt ist: Manchmal ist der schnellste Weg zum DataFrame nicht über Python.

Wann was verwenden

Hier ist mein Entscheidungsbaum:

Verwende pd.read_html() wenn:

  • Einfache statische HTML-Tabelle
  • Öffentliche Seite, keine Authentifizierung
  • Du wiederholte Abrufe automatisieren musst

Verwende BeautifulSoup wenn:

  • pd.read_html() fehlschlägt
  • Du präzise Kontrolle über die Extraktion brauchst
  • Die Tabellenstruktur ungewöhnlich ist

Verwende Selenium wenn:

  • JavaScript die Tabelle rendert
  • Du erst mit der Seite interagieren musst
  • Automatisierung erforderlich ist

Verwende Browser-Export wenn:

  • Einmalige Datenextraktion
  • Komplexe Seite, die mühsam zu scrapen wäre
  • Du die Daten in 30 Sekunden willst, nicht in 30 Minuten

Ein praktisches Beispiel

Angenommen, du willst BIP-Daten der Weltbank, die in einer Tabelle auf deren Website angezeigt werden.

Der pd.read_html()-Ansatz:

import pandas as pd

url = 'https://data.worldbank.org/indicator/NY.GDP.MKTP.CD'
tables = pd.read_html(url)

# Hoffen, dass es funktioniert hat, und rausfinden, welcher Tabellenindex der richtige ist
for i, table in enumerate(tables):
    print(f"Tabelle {i}: {table.shape}")
Enter fullscreen mode Exit fullscreen mode

Manchmal funktioniert das. Manchmal wird die Tabelle per JavaScript geladen und du bekommst nichts Brauchbares.

Der Browser-Export-Ansatz:

  1. Seite öffnen
  2. Export-Button in der Erweiterung klicken
  3. CSV wählen
  4. df = pd.read_csv('weltbank_bip.csv')

Gesamtzeit: circa 30 Sekunden.

Früher hatte ich das Gefühl, das wäre „geschummelt" – echte Data Engineers schreiben Scraper, oder? Aber dann habe ich gemerkt, dass das eigentliche Ziel ist, die Daten schnell und korrekt zu bekommen. Die Methode ist nur Mittel zum Zweck.

Das Fazit

pd.read_html() ist unterschätzt für einfache Fälle. Browser-basierter Export ist unterschätzt für komplexe Fälle. Und einen eigenen Scraper zu schreiben sollte dein letzter Ausweg sein, nicht dein erster Instinkt.

Wähle das passende Tool für die Aufgabe. Deine Zeit ist mehr wert, als zu beweisen, dass du HTML in Python parsen kannst.


Mehr erfahren über HTML Table Exporter oder kostenlos im Chrome Web Store ausprobieren. Wie holst du dir Web-Tabellen am liebsten? Schreib es in die Kommentare.

Top comments (0)