html2text installiert nur ein Paket mit einem Speicherbedarf von 0,2 MiB — damit ist es neunmal kleiner als die nächstgelegene Python-Alternative und vierzigmal kleiner als die Node-Variante. Es hat in der Konvertierungssuite alle vier Seiten vollständig verarbeitet und alle 16 registrierten Body-Probes beibehalten. Diese Probes prüfen lediglich, ob ausgewählte Texte im Body erhalten bleiben; sie bewerten weder Hierarchie noch Verschachtelung von Listen, Linkziele, doppelte Inhalte oder die vollständige Treue von Tabellen.
Außerdem steht die Software unter GPL-3.0-or-later. Das ist in diesem Vergleich die eine Eigenschaft, die in keinem benchmark auftaucht, aber ein Paket unter Umständen komplett disqualifizieren kann.
Was html2text ist
html2text ist eine Python-Bibliothek, die HTML in Markdown-ähnlichen Klartext umwandelt. Die Linie geht auf Aaron Swartz' ursprüngliche Version zurück, und die aktuell gepflegte Reihe liegt bei 2025.4.15 — eine datumsbasierte Version aus April 2025, mit 2.168 GitHub-Stars, 95 offenen Issues und dem letzten Push im Oktober 2025.
Offizielle Referenz: das offizielle Repository von html2text.
import html2text
h = html2text.HTML2Text()
h.body_width = 0 # siehe unten; der Standard wird Sie überraschen
md = h.handle(html)
pip install html2text zieht 1 Paket und 0,2 MiB ein und importiert kalt in 0,077 s. Keine Abhängigkeiten. In einem Container-Image oder einer Lambda-Layer ist das ein spürbarer Unterschied zu markdownify mit 1,8 MiB und turndown mit 8,8 MiB.
Der Standardwert, der jede Zahl verändert

body_width hat standardmäßig den Wert 78. html2text bricht also jede Ausgabelinie hart auf 78 Zeichen um, sofern Sie das nicht abschalten.
Das ist ein vernünftiger Standard für eine Bibliothek, deren ursprüngliche Aufgabe es war, lesbaren Klartext für Terminals und E-Mail zu erzeugen. Für alles, was in ein Modell oder in einen Diff eingespeist wird, ist es jedoch der falsche Standard, weil eingefügte Zeilenumbrüche die Tokenisierung verändern, lange Links auf mehrere Zeilen aufteilen und Vergleiche damit praktisch wertlos machen.
Ich habe für alles unten body_width = 0 gesetzt und das bewusst offengelegt, statt es zu verstecken: Mit aktiviertem Umbruch wären in diesem Artikel alle Zeichen- und Tokenzahlen anders. Wenn Sie selbst Konverter benchmarken, ist das die Einstellung, die Ihre Zahlen still und leise unvergleichbar macht.
Die Messung
Ich habe html2text auf einer benannten vierseitigen Konvertierungssuite ausgeführt, die auch im markitdown-Vergleich verwendet wurde — mit vorab registrierten Probe-Strings: ausgewählte Body-Strings, die erhalten bleiben müssen, sowie Boilerplate-Strings, deren Vorkommen zeigt, dass auch der Seitenrahmen durchkam. Dieselben vier Dateien, dieselben Probes, ein gemeinsamer Scorer für alle vier Konverter. Das Überleben der Probes misst das Vorhandensein registrierter Strings, nicht die strukturelle Korrektheit; deshalb sind Tabellen- und Linkspalten separat ausgewiesen.
| Konverter | Body-Probes | Ausgabekennzeichen | Tokens (o200k) | Markdown-Tabellenzeilen | Links |
|---|---|---|---|---|---|
| html2text | 16/16 | 76.452 | 21.176 | 32 | 545 |
| markdownify | 16/16 | 76.868 | 21.062 | 36 | 599 |
| markitdown | 16/16 | 76.995 | 21.336 | 36 | 598 |
| turndown | 16/16 | 95.188 | 26.236 | 0 | 611 |
fourway-scores.json. Vier Fixtures, Token gezählt mit o200k_base.
Kleinste Ausgabe der vier mit 76.452 Zeichen und bei den Tokens praktisch gleichauf mit markdownify und markitdown — 21.176 gegenüber 21.062 und 21.336, also eine Spreizung von 1,3 %, die ich nicht als echten Unterschied bezeichnen würde.
32 Tabellenzeilen gegenüber 36 bei markdownify und markitdown in der vierseitigen Suite. Der Abstand von vier Zeilen entsteht auf der unregelmäßigen Wikipedia-Fixture und nicht durch den im nächsten Abschnitt beschriebenen Unterschied beim Outer-Pipe-Format.
Die wenigsten Links mit 545, gegenüber 598 bis 611 bei den anderen. Das lohnt sich für Ihre eigenen Seiten zu prüfen, wenn Linkerhalt wichtig ist — in dieser Spalte liegt html2text klar unter der Gruppe und nicht nur innerhalb der Gruppe.
Die Tabellen, die mein Regex nicht gesehen hat

Dieser Punkt ist erwähnenswert, weil ich dazu beinahe das falsche Ergebnis veröffentlicht hätte.
Mein erster Zähler für Tabellenzeilen verlangte führende und abschließende Pipes — ^\|.*\|$. Nach dieser Regel erzielte html2text 1 Tabellenzeile über fünf Dateien: die vierseitige Konvertierungssuite plus eine separate synthetische Fixture mit komplexen Tabellen. Dieser Zähler hat also einen Markdown-Stil gemessen, nicht Tabellen.

html2text erzeugt Tabellen nämlich so:
Team Name | Year | Wins | Losses | Win %
---|---|---|---|---
Boston Bruins | 1990 | 44 | 24 | 0.55
Ohne äußere Pipes. Das ist eine übliche Pipe-Table-Syntax, aber das Test-Setup hat sie nicht rendererübergreifend validiert. Für einen Regex, der den Outer-Pipe-Stil erwartet, ist sie unsichtbar. Nachdem ich den Zähler so umgeschrieben hatte, dass er nach einer Folge von pipehaltigen Zeilen mit einer Trennzeile darin sucht, stieg html2text von 1 Zeile auf 32 in der vierseitigen Suite und 91 über alle fünf Dateien.
Die Erkenntnis lautet also nicht, dass html2text keine Tabellen kann. Sondern dass zwei von vier Konvertern äußere Pipes ausgeben und einer nicht — relevant, wenn Sie das Markdown später mit eigenen Mustern weiterverarbeiten. Das ist tatsächlich wichtig, und ich hätte es mit meinem ersten Zähler komplett übersehen.
Was es entfernt und wo es Zeilen verliert
Zwei Befunde, die in entgegengesetzte Richtungen weisen.
Es entfernt <script> und <style>. Gemessen über Marker, die nur innerhalb dieser Elemente vorkommen, enthält die Ausgabe von html2text über alle Fixtures hinweg keine Script-Marker und keine Style-Marker. turndown enthält 10 und 84 — auf der Wikipedia-Fixture sind das acht Zeilen der eingebetteten JavaScript-Konfiguration von MediaWiki und CSS im Umfang von 14.644 Zeichen (script-style-stripping.json). Für modellgebundene Ausgaben war das auf dieser Fixture die größte beobachtete Quelle vermeidbaren Textes. Ein nachgelagerter Kostenfaktor wurde nicht gemessen.
Es verliert Tabellenzeilen auf der schwierigen Seite. Die vierseitige Suite ergibt folgendes Bild:
| Fixture | html2text | markdownify |
|---|---|---|
| Books to Scrape | 0 Zeilen | 0 Zeilen |
| Quotes to Scrape | 0 Zeilen | 0 Zeilen |
| Hockey statistics | 27 Zeilen | 27 Zeilen |
| Wikipedia | 5 Zeilen | 9 Zeilen |
| Vier-Seiten-Gesamt | 32 Zeilen | 36 Zeilen |
Die separate synthetische Fixture mit komplexen Tabellen bringt 59 html2text-Zeilen und 62 markdownify-Zeilen hinzu, sodass die Summen über fünf Dateien bei 91 und 98 liegen. Sie gehört nicht zum eigentlichen Vier-Seiten-Hauptvergleich. Auf der sauberen Hockey-Tabelle stimmen beide überein. Auf Wikipedia, wo die Tabellen verschachtelt und unregelmäßig sind, erzeugt html2text fünf Zeilen, während markdownify neun ausgibt.
Das Muster lautet also: einfache Tabellen, identisch; knifflige Tabellen, html2text liefert weniger. Wenn Ihre Seiten Tabellen wie auf Wikipedia enthalten, sollten Sie das vor einer Entscheidung testen. Wenn sie eher wie eine Statistikseite aufgebaut sind, sind die beiden in diesem Punkt austauschbar.
Die Lizenz
| Bibliothek | Lizenz | Pakete | Speicherbedarf |
|---|---|---|---|
| html2text | GPL-3.0-or-later | 1 | 0,2 MiB |
| markdownify | MIT | 5 | 1,8 MiB |
| turndown | MIT | 3 (npm) | 8,8 MiB |
Offizielle Referenz: html2text auf PyPI.
Dreifach bestätigt: in den PyPI-Metadaten, im GitHub-Repository und in der eigenen METADATA-Datei des installierten Pakets, wo License-Expression: GPL-3.0-or-later steht.
Was das praktisch bedeutet, hängt davon ab, wie die Software integriert, weitergegeben und ausgeliefert wird. Interne Nutzung oder rein netzwerkbasierte Nutzung ist in der GPL-Welt im Allgemeinen ein anderer Fall als Software, die das Paket enthält oder mit ihm kombiniert wird. Dieser Artikel ist jedoch keine Rechtsberatung. Teams, die Software ausliefern, sollten die genaue Integrations- und Distributionsweise juristisch prüfen lassen.
Der unangenehme Punkt ist die Korrelation: Die Bibliothek mit dem kleinsten Footprint — also genau die, die man wählt, um ein auslieferbares Artefakt möglichst klein zu halten — ist ausgerechnet die mit der Lizenz, die die Distribution am stärksten einschränken kann. Beide Alternativen stehen unter MIT.
Ich bin kein Anwalt und das ist keine Beratung — nur eine belegte Tatsache, die gerade deshalb wichtig ist, weil sie am ehesten ins Gewicht fällt und am wenigsten in einer Vergleichstabelle auftaucht.
Wartung
Letzte Veröffentlichung 2025.4.15, letzter Repository-Push im Oktober 2025 — also ungefähr zehn Monate vor dem Test, mit 41 Releases seitdem. requires_python >= 3.9, und die Bibliothek ließ sich unter Python 3.14.2 sauber installieren und ausführen.
Das wirkt ruhiger als markdownify (letzte Version sechs Wochen vor dem Test) und turndown (vier Monate), aber deutlich aktiver als gar nichts. Bei einer Bibliothek, die HTML in Text umwandelt — also ein Problem, das sich nicht besonders schnell verändert — liest sich ein Abstand von zehn Monaten eher nach Stabilität als nach Stillstand. Die 95 offenen Issues sind das größere Signal; hier lohnt sich vor einer Entscheidung ein Blick darauf, ob etwas dabei ist, das Ihrem Einsatzzweck ähnelt.
Speicherverbrauch und was kaputtes HTML damit macht
Hier werden zwei operative Fragen getrennt gemessen.
Der breitere Stress-Test-Kontext findet sich im Vergleich von Speicherverbrauch und fehlerhaftem HTML über zehn Bibliotheken.
Peak-RSS, gemessen mit /usr/bin/time -l, pro Zelle ein frischer Prozess — die Import-Basis zeigt, was die Bibliothek im geladenen Leerlauf kostet; die Peaks enthalten zusätzlich das Dokument.
| Bibliothek | Laufzeit | Import-Basis | Peak bei 226 KB | Peak bei 10 MB |
|---|---|---|---|---|
| html2text | python3.14 | 18,7 | 19,9 | 71,2 |
| pyquery | python3.14 | 30,3 | 33,9 | 172,5 |
| resiliparse | python3.14 | 20,5 | 25,1 | 225,1 |
| markdownify | python3.14 | 23,9 | 28,9 | 278,5 |
| goose3 | python3.14 | 44,1 | 52,4 | 398,5 |
| cheerio | node22 | 66,8 | 76,5 | 398,5 |
| justext | python3.14 | 30,3 | 36,6 | 431,2 |
| newspaper4k | python3.14 | 52,6 | 61,8 | 668,5 |
| trafilatura | python3.14 | 52,5 | 64,8 | 927,1 |
| turndown | node22 | 47,8 | 68,4 | 2947,1 |
memory-results.json. Python- und Node-Baselines sind nicht direkt miteinander vergleichbar; der Interpreter steckt in beiden.
html2text ist hier auf beiden gemessenen Achsen der leichteste Eintrag. Die Import-Basis von 18,7 MiB und der Peak von 71,2 MiB auf der 10-MB-Fixture ergeben einen inkrementellen RSS von 52,5 MiB: (71,2 - 18,7) / 10 = 5,25× der Fixture-Größe. Vergleichen Sie das mit den absoluten und inkrementellen Werten in der Tabelle und behalten Sie die oben genannte Python/Node-Einschränkung im Kopf.
Fehlerhaftes HTML. Zwölf Dokumente, von denen jedes genau einen Fehler enthält — nicht geschlossene Tags, falsch verschachtelte Inline-Elemente, nicht gequotete Attribute mit Leerzeichen, überzählige schließende Tags, kein <html>-Element, doppelte Attribute, ein mitten im Tag abgeschnittenes Dokument, fehlerhafte Entities, ein nicht geschlossenes <script>, eine falsche Charset-Deklaration, ein Kommentar mit Markup und 600 Verschachtelungsebenen — plus zwei wohlgeformte Kontrollfälle in passenden Größen, denn „es kam nichts zurück“ sagt nur dann etwas über Fehlerhaftigkeit aus, wenn die Bibliothek auch bei einem sauberen Dokument derselben Größe schweigt.
html2text löste auf 0 von 14 Fällen eine Ausnahme aus und gab auf 0 Fällen nichts zurück; außerdem konnte es 33/33 Marker in den defekten Fixtures wiederherstellen (malformed-results.json). Eine Fixture ist aus dieser Zählung ausgenommen: Nach HTML5 ist alles nach einem nicht geschlossenen <script> tatsächlich Script-Inhalt, daher ist der Verlust dort korrekt und das Wiederherstellen die Abweichung.
Vor- und Nachteile
Spricht dafür. Nur ein Paket, 0,2 MiB, keine Abhängigkeiten — mit Abstand das kleinste Paket im Vergleich. Kleinste Ausgabe der vier und bei den Tokens praktisch gleichauf mit markdownify und markitdown. Erzeugt erkennbare Pipe-Table-Syntax. Läuft unter Python 3.14. Lange, stabile Historie.
Spricht dagegen. GPL-3.0-or-later, die die Alternativen nicht haben. Standardmäßig body_width=78, wodurch die Ausgabe hart umbrochen wird und Messungen oder Diffs verfälscht, wenn man das nicht abschaltet. Die wenigsten erhaltenen Links (545 gegenüber 598–611). Tabellen verwenden den Stil ohne äußere Pipes, was naive nachgelagerte Regex bricht. 95 offene Issues und ein langsamerer Release-Rhythmus als bei markdownify.
Für wen es geeignet ist — und für wen nicht
Nutzen Sie html2text, wenn das Abhängigkeitsbudget wirklich eng ist und das geplante Integrations- sowie Distributionsmodell bereits rechtlich geprüft wurde. Ein einziges Paket ohne Abhängigkeiten ist operativ ein echter Vorteil: eine kleinere Oberfläche zum Prüfen und Ausrollen.
Setzen Sie body_width = 0 direkt in der ersten Zeile, außer Sie wollen ausdrücklich umgebrochenen Klartext.
Lassen Sie es weg, wenn Sie Software ausliefern und Copyleft ein Problem ist — markdownify steht unter MIT, ist hier bei den Tokens gleichauf und erreicht bei Tabellen dasselbe wie markitdown, braucht aber 1,6 MiB mehr. Lassen Sie es ebenfalls weg, wenn Ihnen Linkerhalt wichtig ist, denn hier war html2text am schwächsten. Und lassen Sie es weg, wenn Ihre nachgelagerte Verarbeitung äußere Pipes in Tabellenzeilen erwartet.
Wo eine verwaltete API passt
html2text wandelt HTML um, das Sie bereits besitzen. Es lädt keine Seiten, rendert kein JavaScript und behandelt keine Anti-Bot-Schicht — keines der vier Konverter-Tools tut das, und bei vielen realen Zielen ist genau das der schwierigere Teil.
Für dieselben Fixtures über alle fünf Konverter hinweg siehe den fünfseitigen Vergleich von HTML zu Markdown.
Ein gehosteter Fetch-/Render-/Extraktionsdienst, einschließlich unseres eigenen Thunderbit, arbeitet auf einer anderen Ebene. Thunderbit wurde hier nicht benchmarked. Die relevante Grenze ist also: Konvertierung von geliefertem HTML versus ein Dienst, der eine URL selbst abruft und verarbeitet; dieser Artikel liefert keinen Qualitäts-, Latenz- oder Kostenvergleich auf derselben Messgrundlage.
Die faire Einordnung: Wenn Sie das HTML schon haben, Markdown wollen und GPL für Ihr Vertriebsmodell kein Problem ist, ist html2text kostenlos und erstaunlich klein. Wenn Sie Seiten erst abrufen müssen oder eher Zeilen als Prosa brauchen, dann ist das ein anderes Produkt.
Für den größeren Marktüberblick deckt unser Roundup zu Web-Scraping-APIs gehostete Optionen ab und der Pillar zu Open-Source-Scrapern die selbst gehosteten Varianten. HTML in Python zu Markdown konvertieren ist der praktische Leitfaden.
Thunderbit für Webdatenextraktion testen
Sollte man html2text verwenden?
Es ist ein starker Kandidat, wenn der Footprint zählt, Umbruch bewusst deaktiviert wird und das Distributionsmodell die Lizenzprüfung besteht.
Die Tokenzahl lag in der vierseitigen Suite innerhalb von 1,3 % von markdownify und markitdown. Das bedeutet aber nicht, dass die Gesamtqualität gleich ist: html2text hat weniger Links und auf der unregelmäßigen Wikipedia-Fixture weniger Tabellenzeilen erhalten. Zwei operative Details sind sofort wichtig: body_width = 0 und der Tabellenstil ohne äußere Pipes.
Falls die GPL-Prüfung es ausschließt, ist markdownify MIT-lizenziert, lag hier bei Ausgabegröße und Tokenzahl ähnlich, erhielt mehr Links und mehr Zeilen bei den unregelmäßigen Tabellen und belegte in dieser Umgebung 1,6 MiB mehr Speicherplatz.
Thunderbit für Webdatenextraktion testen Get Started Free
FAQs
Konvertiert html2text Tabellen?
Ja. Mein erster Zähler behauptete, es habe über fünf Dateien nur eine Tabellenzeile erzeugt — das war falsch, weil er führende und abschließende Pipes verlangte, während html2text Team Name | Year | Wins ohne diese Zeichen ausgibt. Das ist eine übliche Pipe-Table-Markdown-Syntax, auch wenn dieses Test-Setup keine Kompatibilitätsprüfung über verschiedene Renderer hinweg durchgeführt hat. Mit dem korrigierten Zähler erzeugte html2text 32 Zeilen gegenüber 36 bei markdownify in der vierseitigen Suite und 91 gegenüber 98, wenn die separate komplexe Tabellen-Fixture einbezogen wird.
Was macht body_width, und warum sollte man es ändern?
Es bricht die Ausgabe standardmäßig bei 78 Zeichen hart um — sinnvoll für terminallesbaren Klartext, aber schlecht für fast alles andere. Durch den Umbruch entstehen Zeilenumbrüche mitten im Satz, lange URLs werden aufgeteilt und die Tokenisierung verändert sich. Jede Zahl in dieser Analyse verwendet body_width = 0; mit dem Standardwert wären sie alle anders.
Ist die GPL-Lizenz wirklich ein Problem?
Das hängt vom konkreten Integrations- und Distributionsmodell ab. Interne oder rein netzwerkbasierte Nutzung und das Weitergeben von Software sind unterschiedliche Prüffälle, aber dieser Artikel bewertet das rechtlich nicht abschließend. Teams, die Software ausliefern, sollten die Bedingungen von GPL-3.0-or-later juristisch prüfen lassen; markdownify und turndown stehen unter MIT. Die Lizenzangabe von html2text ist in den PyPI-Metadaten, auf GitHub und in der METADATA-Datei des installierten Pakets bestätigt.
Ist eine Veröffentlichung aus April 2025 ein Problem? Für sich genommen vermutlich nicht. HTML-zu-Text-Konvertierung ist ein stabiles Problem, die Bibliothek ließ sich sauber unter Python 3.14.2 installieren und ausführen, und 41 Releases liegen hinter ihr. Die 95 offenen Issues sind der Wert, den ich mir wirklich ansehen würde — prüfen Sie sie vor einer Entscheidung auf etwas, das Ihrem Input ähnelt, denn ein ruhiges Repository bedeutet oft, dass Sie am Ende selbst die Fehler beheben.
Was wurde hier nicht getestet?
Vier Konvertierungs-Fixtures und eine separate komplexe Tabellen-Fixture sind immer noch ein kleines Testset. Der Test umfasste aber zwölf synthetische fehlerhafte Dokumente plus zwei Kontrollen: html2text löste in 0/14 Fällen eine Ausnahme aus, gab in 0/14 Fällen leere Ergebnisse zurück und stellte alle 33 bewerteten Marker wieder her. Nicht abgedeckt wurden real beschädigte Seiten, breitere Fehlermuster, verschachtelte Listen, Definitionslisten, Fußnoten oder Mathe. Die komplette Optionsoberfläche — ignore_links, ignore_images, unicode_snob, single_line_break und der Rest — blieb mit Ausnahme von body_width auf den Standardwerten. Die Link-Lücke wurde beobachtet, aber nicht diagnostiziert, und ein Markdown-Roundtrip wurde nicht getestet.


