Auf den vier HTML-Beispielen, die mit markitdown geteilt wurden, erzeugte markdownify unter unserem Zähler exakt dieselbe Anzahl an ausgegebenen Markdown-Tabellenzeilen — 36 zu 36 — und stellte alle 16 geprüften Inhaltsstrings wieder her. Mit 21.062 Tokens lag die Ausgabe nominell am niedrigsten, auch wenn die ersten drei Konverter innerhalb von 1,3 % lagen. Die Installation belegt nur 1,8 MiB, ist unter MIT lizenziert und hatte zum Zeitpunkt der Messung 2.235 GitHub-Sterne.
Es ist die in dieser Kategorie am wenigsten diskutierte Bibliothek und, gemessen an diesen Werten, diejenige, zu der ich greifen würde.
Was markdownify ist
markdownify ist ein Python-Converter von HTML zu Markdown, aufgebaut auf BeautifulSoup. Das ist die gesamte Architektur: mit BeautifulSoup parsen, den Baum durchlaufen, Markdown ausgeben. Getestete Version: 1.2.3, MIT, 2.235 Sterne, 42 offene Issues, letzte Veröffentlichung am 2026-06-30 — aktiv gepflegt, 44 Releases.
Offizielle Referenz: python-markdownify’s offizielles Repository.

Die API besteht aus genau einer Funktion:
from markdownify import markdownify
md = markdownify(html)
Es gibt außerdem eine Klassenvariante (MarkdownConverter), falls Sie das Verhalten einzelner Elemente anpassen möchten, sowie eine solide Auswahl an Optionen — Überschriftenstil, Aufzählungszeichen, Erkennung von Code-Sprachen, Entfernen von Elementen. In der Praxis ist jedoch der Einzeiler der Standardfall, und der funktioniert.
pip install markdownify zieht 5 Pakete und 1,8 MiB nach sich und importiert im Kaltstart in 0,046 s — damit ist es der schnellste der drei getesteten Konverter. Der Abhängigkeitsbaum besteht aus BeautifulSoup und den üblichen Begleitpaketen, die viele Python-Projekte ohnehin bereits mitbringen, sodass die Zusatzkosten oft nahezu null sind.
Die Messung
Ich habe es auf denselben vier HTML-Beispielen ausgeführt, die ein anderer Stack in diesem Basisvergleich bereits für markitdown genutzt hatte, inklusive seiner vorregistrierten Prüffragmente — 16 exakte Body-Strings wurden auf ihr Überleben geprüft, dazu Boilerplate-Checks für die Seitenstruktur. Ein fünftes Beispiel, Nur Tabellen, ist ein separates Diagnosetool mit starkem Tabellenfokus und wird aus dem Vierer-Aggregat unten ausgeschlossen.
| Konverter | Body-Probes | Ausgabezeichen | Tokens (o200k) | Markdown-Tabellenzeilen | Links |
|---|---|---|---|---|---|
| markdownify | 16/16 | 76.868 | 21.062 | 36 | 599 |
| html2text | 16/16 | 76.452 | 21.176 | 32 | 545 |
| markitdown | 16/16 | 76.995 | 21.336 | 36 | 598 |
| turndown | 16/16 | 95.188 | 26.236 | 0 | 611 |
fourway-scores.json. Vier Beispiele, Tokens gezählt mit o200k_base, Tabellenzeilen mit derselben Regel über alle vier hinweg — inklusive einer erneuten Auszählung der gespeicherten markitdown-Ausgabe, die exakt mit dem veröffentlichten Wert übereinstimmte.
Drei Dinge fallen besonders auf.
Es liegt bei der Anzahl ausgegebener Tabellenzeilen gleichauf mit markitdown. 36 Zeilen auf den vier gemeinsamen Beispielen, mit derselben Heuristik gezählt. Das beweist keine 1:1-Übereinstimmung auf Zellebene; es zeigt nur, dass beide Ausgaben für diesen Zähler gleich viele erkennbare Markdown-Tabellenzeilen enthielten.
Es hat die niedrigste Token-Zahl. 21.062, leicht unter den 21.176 von html2text und den 21.336 von markitdown, und 19,7 % unter den 26.236 von turndown. Die ersten drei liegen innerhalb von 1,3 % zueinander — für mich ein Unentschieden, kein klarer Sieg; der relevante Abstand besteht zu turndown.
Alle Inhaltsprüfungen haben überlebt. Alle 16. Bei den anderen drei war das ebenfalls so — bei der reinen Inhaltsübernahme unterscheiden sich diese Bibliotheken nicht.
Die Tabelle, die es richtig hinbekommt
Das Hockey-Statistik-Beispiel ist die Stelle, an der sich Konverter trennen. markdownify:
| Team Name | Year | Wins | Losses | OT Losses | Win % | ... |
| --- | --- | --- | --- | --- | --- | --- |
| Boston Bruins | 1990 | 44 | 24 | | 0.55 | ... |
Standard-GFM mit führenden und nachgestellten Pipes, einer Trennzeile und — wichtig ist die leere Zelle zwischen 24 und 0.55 — es gibt die leere Zelle aus, statt sie zu überspringen. Das klingt banal, ist es aber nicht: Ein Konverter, der leere Zellen verwirft, verschiebt jeden Wert danach in die falsche Spalte, während die Ausgabe trotzdem wie eine gültige Tabelle aussieht.

turndown gibt bei derselben Eingabe jeden Wert als eigenen Absatz aus, ganz ohne Spaltenstruktur. html2text erzeugt eine korrekte Tabelle in einem anderen Stil, allerdings ohne äußere Pipes.
Wenn das Markdown in ein Modell geht, sind die Pipes und die erhaltene leere Zelle genau das, was es erlaubt, „wie viele Spiele hat Boston verloren“ zu beantworten, statt zu raten.
Zwei Dinge, die es entfernt und turndown nicht
Die Tabellen-Treue ist der sichtbare Unterschied. Das hier ist größer, und kaum jemand spricht darüber.
markdownify entfernt den Inhalt von <script> und <style>. turndown tut das nicht. Gemessen an Markern, die ausschließlich in diesen Elementen vorkommen, enthält markdownify über die Beispiele hinweg null Script-Marker und null Style-Marker; turndown enthält 10 und 84. Am Wikipedia-Beispiel ist das der Unterschied zwischen 59.561 Zeichen und 74.939 — und acht Zeilen mit MediaWikis Inline-JavaScript-Konfiguration und CSS machen 14.644 Zeichen aus, also 95 % dieser Differenz (script-style-stripping.json).
Für alles, was in ein Modell fließt, ist das in diesem Vergleich der teuerste Punkt: Ein JavaScript-Konfigurationsblock kostet Tokens und transportiert keinerlei Information. markdownify entfernt ihn ungefragt. html2text übrigens auch.
Pro Beispiel stimmen markdownify und html2text dort exakt überein, wo die Tabelle einfach ist, und unterscheiden sich dort, wo sie es nicht ist:
| Beispiel | markdownify | html2text |
|---|---|---|
| Hockey-Statistik | 27 Zeilen | 27 Zeilen |
| Wikipedia | 9 Zeilen | 5 Zeilen |
| Nur Tabellen (separates Diagnosebeispiel) | 62 Zeilen | 59 Zeilen |
markdownify erzeugt in beiden Diagnosen mehr erkannte Zeilen. Gerade bei Wikipedia bleiben nach diesem Zähler neun Zeilen erhalten, während html2text nur fünf behält. Das ist ein nützlicher Hinweis, repräsentative verschachtelte und unregelmäßige Tabellen vor der Entscheidung zu prüfen — aber kein Beweis dafür, dass jede ausgegebene Zelle semantisch korrekt ist.
Installation und Lizenz im Vergleich zu den Alternativen
| Bibliothek | Pakete | Speicherbedarf | Kaltimport | Lizenz | Sterne | Letztes Release |
|---|---|---|---|---|---|---|
| markdownify | 5 | 1,8 MiB | 0,046 s | MIT | 2.235 | 2026-06-30 |
| html2text | 1 | 0,2 MiB | 0,077 s | GPL-3.0-or-later | 2.168 | 2025-04-15 |
| turndown | 3 (npm) | 8,8 MiB | 0,056 s | MIT | 11.386 | 2026-04-03 |
Offizielle Referenz: markdownify auf PyPI.
install-and-import.json und metadata-snapshot.json. Jede Bibliothek wurde in eine eigene leere Umgebung installiert.
html2text ist auf der Festplatte neunmal kleiner und steht unter GPL-3.0-or-later. Für ein verteiltes Produkt sollte das die Stelle sein, an der die für die Lizenz Verantwortlichen genauer hinschauen; dieser Artikel ist keine Rechtsberatung. markdownify ist MIT-lizenziert, also in der Regel permissiver, gehört aber trotzdem in die normale Compliance-Prüfung.
Die 1,8 MiB sind zudem etwas nominell, falls Ihr Projekt ohnehin bereits BeautifulSoup verwendet — was bei sehr vielen Python-Scraping-Projekten der Fall ist. Dann sind die Zusatzkosten von markdownify praktisch nahe null.
Die Release-Frequenz von markdownify ist die gesündeste der drei: 44 Releases und ein Update sechs Wochen vor dem Testzeitpunkt, verglichen mit dem letzten Release von html2text im April 2025.
Was eine einzige Python-Zeile tatsächlich liefert
Die ganze Bibliothek ist markdownify(html), und es lohnt sich, klar zu sagen, was dieser Aufruf für Sie entscheidet — denn drei dieser Entscheidungen sind genau die, auf die dieser Vergleich hinauslief.
Es parst mit BeautifulSoup, entfernt <script> und <style> ohne Nachfrage und erzeugt GFM-ähnliche Pipe-Tabellen mit äußeren Pipes und erhaltenen leeren Zellen. Die Herkunft des Parsers allein garantiert noch kein Verhalten bei kaputtem Input, daher wird diese Frage unten separat gemessen.
Nichts davon sind Optionen, die Sie explizit setzen. Das ist das Default-Verhalten — und in einer Kategorie, in der turndowns Standard JavaScript beibehält und html2text standardmäßig bei 78 Zeichen hart umbrechen lässt, ist eine Bibliothek, die out of the box keine Korrektur braucht, bereits ein klarer Vorteil.
Wenn Sie sie brauchen, gibt es Optionen: heading_style, bullets, code_language, strip und convert für Allow- und Deny-Listen von Elementen sowie MarkdownConverter für elementbezogene Überschreibungen. Für alle hier gemessenen Werte wurden keine davon verwendet.
Speicher und was kaputtes HTML damit macht

Der breitere Kontext des Stresstests ist im Vergleich zu Speicherverbrauch und fehlerhaftem HTML über zehn Bibliotheken beschrieben.
Zwei Dinge, die in jeder Review dieser Runde zunächst als ungetestet markiert waren, sind jetzt gemessen.
Maximaler residenter Speicherverbrauch per /usr/bin/time -l, je Feld ein frischer Prozess — die Import-Basis ist das, was die Bibliothek im geladenen, aber untätigen Zustand kostet; die Spitzenwerte enthalten 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-Basen sind nicht direkt miteinander vergleichbar; der Interpreter steckt in beiden.
markdownify liegt im Mittelfeld: eine Import-Basis von 23,9 MiB und 278,5 MiB bei einem 10-MB-Dokument. Das ist das 3,9-Fache des Peaks von html2text und ungefähr ein Zehntel von turndown — der Preis für das zugrunde liegende BeautifulSoup.
Kaputtes HTML. Zwölf Dokumente, die jeweils genau eine Sache kaputt machen — nicht geschlossene Tags, falsch verschachtelte Inline-Elemente, nicht gequotete Attribute mit Leerzeichen, überzählige schließende Tags, gar kein <html>, doppelte Attribute, ein Dokument, das mitten im Tag abgeschnitten wurde, ungültige Entities, ein nicht geschlossener <script>-Block, eine falsche Charset-Deklaration, ein Kommentar mit Markup und 600 Ebenen Verschachtelung — plus zwei wohlgeformte Kontrollen mit 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 still bleibt.
markdownify warf bei 1 von 14 Fällen eine Exception und gab bei 0 Fällen nichts zurück; es stellte 30/33 Sentinel-Werte aus den kaputten Beispielen wieder her (malformed-results.json). Ein Beispiel wird aus dieser Zählung ausgeschlossen: Nach HTML5 ist alles nach einem nicht geschlossenen <script> tatsächlich Script-Inhalt, daher ist es korrekt, das dort zu verlieren — und das Wiederherstellen wäre die Abweichung.
Vor- und Nachteile
Dafür spricht. Tabellen-Treue gleichauf mit markitdown, mit derselben Regel gezählt. Niedrigste Token-Zahl der vier. MIT. 1,8 MiB und praktisch keine Zusatzkosten, wenn BeautifulSoup ohnehin schon im Projekt ist. Schnellster Kaltimport mit 0,046 s. Aktiv weiterentwickelt. Erhält leere Tabellenzellen. Elementweise Anpassung über MarkdownConverter. Der einfache Einzeiler ist hier die richtige Wahl.
Dagegen spricht. Hängt von BeautifulSoup ab und ist damit auf der Festplatte neunmal größer als html2text, falls Sie es nicht ohnehin schon brauchen. 2.235 Sterne bedeuten eine kleinere Community als bei turndown — also weniger erprobte Beispiele, wenn Sie auf etwas Seltsames stoßen. Nur für Python, also keine Hilfe in einem Node-Stack. Und 42 offene Issues.
Wer es nutzen sollte und wer nicht
Mit markdownify starten sollten Sie bei einem Python-Workload, der diesen Beispielen ähnelt. Es liegt bei der ausgegebenen Tabellenzeilenanzahl gleichauf mit markitdown, gehört zum Cluster mit den niedrigsten Token-Werten und ist MIT-lizenziert. Wenn Sie BeautifulSoup ohnehin schon verwenden, kann der zusätzliche Installations-Fußabdruck klein sein; prüfen Sie die tatsächliche Differenz der Abhängigkeiten in Ihrer Umgebung.
html2text stattdessen prüfen, wenn das Abhängigkeitsbudget in Hunderten von Kilobyte gemessen wird und die Ausgabeform für Ihre Seiten passt. Prüfen Sie die GPL-3.0-or-later-Lizenz vor einer Verteilung mit den dafür Verantwortlichen.
markitdown stattdessen prüfen, wenn Sie bereits PDFs oder Office-Dokumente konvertieren. Bei HTML kamen hier dieselben ausgegebenen Zeilen heraus, aber eine weitergehende Gleichwertigkeit der Ausgabe wurde nicht belegt.
Überspringen Sie es in Node, wo turndown die naheliegende Wahl ist — allerdings nur mit turndown-plugin-gfm zusätzlich, weil der Core von turndown selbst überhaupt keine Tabellen erzeugt.
Wo eine verwaltete API passt
markdownify konvertiert HTML, das Sie bereits haben. Es holt keine Seiten ab, rendert kein JavaScript und geht nicht mit Anti-Bot-Schutz um — das tun die vier Konverter ohnehin nicht, und bei vielen realen Zielen ist genau das der schwierigere Teil.
Für dieselben Beispiele über alle fünf Konverter hinweg siehe den fünffachen HTML-zu-Markdown-Vergleich.
Unser eigener Entwickler-Stack bei Thunderbit deckt diese vorgelagerte Aufgabe ab: POST /distill ruft eine URL ab und liefert Markdown zurück, während POST /extract schemaförmiges JSON zurückgibt. Beide sind über einen MCP-Server und eine CLI verfügbar; die Preise stehen auf der Thunderbit-Preisseite. Diese gehosteten Endpunkte wurden nicht gegen die lokalen Konverter benchmarked, es geht hier also um einen Kategorienunterschied, nicht um einen Leistungsvergleich.
Die ehrliche Einordnung: Wenn Sie das HTML bereits haben und Markdown wollen, ist markdownify kostenlos und erledigt die Aufgabe so gut wie alles hier. Wenn Sie Seiten abrufen oder lieber Zeilen statt Fließtext wollen, ist das ein anderer Kauf.
Für das breitere Feld deckt unser Überblick über Web-Scraping-APIs gehostete Optionen ab und der Pillar zu Open-Source-Scrapern die selbst gehosteten. HTML in Python zu Markdown konvertieren ist die praktische Schritt-für-Schritt-Anleitung.
Thunderbit für Web-Datenextraktion ausprobieren
Sollten Sie markdownify verwenden?
Für Python ist es ein starker Kandidat, wenn Ihre Eingaben diesen Beispielen ähneln; testen Sie es an Ihren eigenen Tabellen und fehlerhaften Seiten, bevor Sie es zum Standard machen.
Es liegt bei der ausgegebenen Tabellenzeilenanzahl gleichauf mit markitdown, befindet sich im Cluster mit den niedrigsten Token-Werten, importiert in diesem Lauf am schnellsten und ist MIT-lizenziert. Dagegen spricht, dass es mehr Speicher als html2text verbraucht, nur für Python verfügbar ist und bei einem fehlerhaften Eingabebeispiel eine Exception ausgelöst hat. Speicherbedarf und Lizenz sind zusätzliche Auswahlkriterien, nicht die einzigen Argumente.
Was mich überrascht, ist die Sternezahl. turndown hat fünfmal so viel Aufmerksamkeit und konvertiert out of the box dennoch keine der Tabellen korrekt, die markdownify sauber verarbeitet. Beliebtheit spiegelt in dieser Kategorie also nicht das gemessene Verhalten wider — genau deshalb war dieser Vergleich sinnvoll.
Thunderbit für Web-Datenextraktion ausprobieren Get Started Free
FAQs
Ist markdownify bei HTML wirklich so gut wie markitdown? Auf diesen vier Beispielen erzeugten beide jeweils 36 erkannte Markdown-Tabellenzeilen, stellten alle 16 geprüften Strings wieder her und lagen in der Zeichenzahl innerhalb von 0,2 % zueinander. Das ist kein Test auf Zellenebene und auch kein Rendering-Gleichheitstest. markitdown verarbeitet außerdem PDF- und Office-Formate, daher bezieht sich dieser Vergleich nur auf die gemessenen HTML-Ausgaben.
Braucht es BeautifulSoup? Ja — das ist sein Parser und macht den Großteil der 1,8 MiB aus. Wenn Ihr Projekt BeautifulSoup bereits nutzt, sind die Zusatzkosten von markdownify gering. Wenn nicht und Speicher wirklich zählt, ist html2text mit 0,2 MiB und einem Paket deutlich kleiner, allerdings auf Kosten einer GPL-3.0-or-later-Lizenz.
Wie behandelt es leere Tabellenzellen? Es gibt sie aus. In dem Beispiel mit Lücken in den Daten bleibt die leere Zelle an ihrer Position erhalten, sodass jeder folgende Wert in der richtigen Spalte bleibt. Ein Konverter, der leere Zellen überspringt, erzeugt eine Tabelle, die weiterhin gültig aussieht, aber jeden Wert eine Spalte nach links verschiebt — die schlechtere Form des Fehlers, weil nichts darauf hinweist.
Sollte ich die Funktion oder die Klasse verwenden?
Die Funktion markdownify() für den Standardfall. MarkdownConverter, wenn Sie das Verhalten eines bestimmten Elements überschreiben müssen — alle hier gemessenen Werte wurden mit der normalen Funktion und den Standardoptionen ermittelt.
Was wurde hier nicht getestet? Vier gemeinsame Beispiele plus ein reines Tabellen-Diagnosebeispiel sind kein repräsentatives Korpus. Die separate Suite für fehlerhaftes HTML deckte 12 benannte Fehlerarten und zwei Kontrollen ab, aber nicht jede Form kaputten HTMLs. Verschachtelte Listen, Definitionslisten, Fußnoten, Mathe, Markdown-zu-HTML-Roundtrips, Tabellen-Gleichwertigkeit auf Zellebene und Konfigurationsvarianten wurden nicht verglichen. Auch die Konvertierungsgeschwindigkeit wurde nicht verglichen.


