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
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)
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()
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:
- Seite im Browser öffnen
- Tabelle mit einer Browser-Erweiterung als CSV exportieren
- In Pandas laden:
df = pd.read_csv('exportierte_tabelle.csv')
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}")
Manchmal funktioniert das. Manchmal wird die Tabelle per JavaScript geladen und du bekommst nichts Brauchbares.
Der Browser-Export-Ansatz:
- Seite öffnen
- Export-Button in der Erweiterung klicken
- CSV wählen
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)