Op de vier HTML-testbestanden die ook met markitdown werden gedeeld, leverde markdownify exact hetzelfde aantal gegenereerde Markdown-tabelrijen volgens onze telling op — 36 tegenover 36 — en herstelde het alle 16 gecontroleerde contentstrings. De uitvoer van 21.062 tokens was formeel de laagste, al zaten de eerste drie converters binnen 1,3% van elkaar. Het pakket installeert in 1,8 MiB, is MIT-gelicenseerd en had op het meetmoment 2.235 GitHub-sterren.
Het is de minst besproken library in deze categorie en, op basis van deze cijfers, degene waar ik zelf voor zou kiezen.
Wat markdownify is
markdownify is een Python-converter van HTML naar Markdown, gebouwd op BeautifulSoup. Dat is de volledige architectuur: parser via BeautifulSoup, door de boom lopen, Markdown uitgeven. Geteste versie: 1.2.3, MIT, 2.235 sterren, 42 open issues, laatst uitgebracht op 2026-06-30 — actief onderhouden, 44 releases.
Officiële referentie: de officiële repository van python-markdownify.

De API bestaat uit één functie:
from markdownify import markdownify
md = markdownify(html)
Er is ook een klassevariant (MarkdownConverter) als je elementafhandeling wilt overschrijven, plus een nette set opties — voor kopstijlen, opsommingstekens, detectie van programmeertaal in codeblokken, en het verwijderen van elementen. Maar in de praktijk is die ene regel meestal genoeg, en die werkt gewoon.
pip install markdownify haalt 5 packages binnen en 1,8 MiB, en een koude import duurt 0,046 s — de snelste van de drie converters die ik ermee vergeleek. De afhankelijkheden zijn BeautifulSoup en de gebruikelijke begeleiders, die al in veel Python-projecten aanwezig zijn, waardoor de extra kosten vaak bijna nul zijn.
De meting
Ik draaide het op dezelfde vier HTML-testbestanden die een andere set in deze benchmark al voor markitdown had gebruikt, met de vooraf geregistreerde probe-strings van die set — 16 exacte bodystrings die moesten overleven, plus controles voor standaard paginabijsnijwerk. Een vijfde bestand, Nothing but tables, is een aparte diagnose met veel tabellen en is uitgesloten van de vier-bestanden-samenvatting hieronder.
| Converter | Body probes | Output chars | Tokens (o200k) | Markdown table rows | 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 testbestanden, tokens geteld met o200k_base, tabelrijen geteld met één uniforme regel over alle vier — inclusief een hertelling van de opgeslagen uitvoer van markitdown, die exact overeenkwam met de gepubliceerde waarde.
Drie zaken springen eruit.
Het komt qua gegenereerd aantal tabelrijen overeen met markitdown. 36 rijen elk op de vier gedeelde testbestanden, geteld met dezelfde heuristiek. Dat bewijst niet dat de cellen één-op-één identiek zijn; het zegt alleen dat beide uitvoer hetzelfde aantal herkenbare Markdown-tabelrijen aan deze teller blootstelden.
Het heeft de laagste tokentelling. 21.062, net onder html2text met 21.176 en markitdown met 21.336, en 19,7% onder turndown met 26.236. De eerste drie liggen binnen 1,3% van elkaar, dus dat noem ik eerder gelijkspel dan overwinning; het verschil dat echt telt is dat met turndown.
Alle contentprobes bleven behouden. Alle 16. Dat gold ook voor de andere drie — inhoudsbehoud is niet waar deze libraries van elkaar verschillen.
De tabel die het goed neerzet
De hockeystatistieken-fixture is waar converters zich onderscheiden. markdownify:
| Team Name | Year | Wins | Losses | OT Losses | Win % | ... |
| --- | --- | --- | --- | --- | --- | --- |
| Boston Bruins | 1990 | 44 | 24 | | 0.55 | ... |
Standaard GFM met pipes aan begin en einde, een scheidingsrij, en — let op de lege cel tussen 24 en 0.55 — het schrijft de lege cel weg in plaats van die over te slaan. Dat klinkt triviaal en dat is het niet: een converter die lege cellen weglaat, schuift alle daaropvolgende waarden een kolom op, terwijl de tabel er nog steeds geldig uitziet.

turndown zet op dezelfde input elke waarde neer als een aparte alinea, zonder enige kolomstructuur. html2text produceert wel een correcte tabel, maar in een andere stijl, zonder de buitenste pipes.
Als de Markdown naar een model gaat, zijn juist die pipes en de behouden lege cel nodig om te kunnen antwoorden op "hoeveel wedstrijden verloor Boston" in plaats van te gokken.
Twee dingen die het verwijdert en turndown niet
Tabelnauwkeurigheid is het zichtbare verschil. Dit verschil is groter en wordt bijna nooit genoemd.
markdownify verwijdert de inhoud van <script> en <style>. turndown doet dat niet. Geteld via markers die alleen in die elementen voorkomen, bevat de output van markdownify over deze testbestanden nul scriptmarkers en nul stylemarkers; die van turndown bevat 10 en 84. In de Wikipedia-fixture betekent dat het verschil tussen 59.561 tekens en 74.939 — en acht regels van MediaWiki’s inline JavaScript-configuratie en CSS verklaren 14.644 tekens, oftewel 95% van dat verschil (script-style-stripping.json).
Voor alles wat een model voedt, is dat het duurste onderdeel in deze vergelijking: een JavaScript-configblob kost tokens en bevat geen bruikbare informatie. markdownify haalt die standaard weg. html2text doet dat ook.
Per testbestand komen markdownify en html2text exact overeen waar de tabel simpel is, en lopen ze uiteen waar die ingewikkelder wordt:
| Fixture | markdownify | html2text |
|---|---|---|
| Hockey statistics | 27 rows | 27 rows |
| Wikipedia | 9 rows | 5 rows |
| Nothing but tables (separate diagnostic) | 62 rows | 59 rows |
markdownify levert in beide diagnosevergelijkingen meer herkenbare rijen op. Vooral op Wikipedia houdt het volgens deze teller negen rijen vast waar html2text er vijf behoudt. Dat is een nuttige waarschuwing om representatieve geneste en onregelmatige tabellen te inspecteren voordat je kiest, maar geen bewijs dat elke afzonderlijke cel semantisch perfect is.
Installatie en licentie, naast de alternatieven
| Library | Packages | Disk | Cold import | Licence | Stars | Last 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 |
Officiële referentie: markdownify op PyPI.
install-and-import.json en metadata-snapshot.json. Elke library werd in een eigen lege omgeving geïnstalleerd.
html2text is op schijf negen keer kleiner, en het is GPL-3.0-or-later. Voor een gedistribueerd product is dat een controlepunt voor wie de licenties beheert; dit artikel is geen juridisch advies. markdownify is MIT, wat meestal ruimer is, maar hoort nog steeds in de gebruikelijke compliance-review thuis.
De 1,8 MiB is bovendien enigszins theoretisch als je project al BeautifulSoup gebruikt, wat bij heel veel Python-scrapingprojecten zo is — in dat geval is markdownify vrijwel gratis.
De releasecadans van markdownify is het gezondst van de drie: 44 releases en een push zes weken vóór de test, tegenover de laatste release van html2text in april 2025.
Wat je met één regel Python daadwerkelijk krijgt
De hele library is markdownify(html), en het is de moeite waard om expliciet te benoemen wat die aanroep voor je beslist, want drie van die keuzes bepalen juist deze vergelijking.
Het parseert met BeautifulSoup, verwijdert <script> en <style> zonder dat je daarom vraagt, en genereert GFM-achtige tabelnotatie met pipes aan de buitenkant en behouden lege cellen. Alleen de parserafkomst zegt nog niets over gedrag bij foutieve input, dus dat onderwerp is hieronder apart gemeten.
Geen van die keuzes hoef je in te stellen. Dit is het standaardgedrag, en in een categorie waar turndown standaard JavaScript laat staan en html2text standaard hard-wrapt bij 78 tekens, heeft een library waarvan het out-of-the-box gedrag meteen goed is op zichzelf al waarde.
De opties zijn er als je ze nodig hebt — heading_style, bullets, code_language, strip en convert voor allowlists en denylists van elementen, en MarkdownConverter voor overschrijvingen per element. Alles wat hier is gemeten, gebruikte geen van die opties.
Geheugen, en wat kapotte HTML daarmee doet

De bredere stress-testcontext staat in de vergelijking van tien libraries voor geheugen en foutieve HTML.
Twee zaken die in elke review in deze reeks nog als ongetest stonden, zijn nu gemeten.
Piek-RSS-geheugen, via /usr/bin/time -l, met per cel één vers proces — de importbodem is wat de library kost als hij geladen en idle is, de pieken bevatten ook het document.
| Library | Runtime | Import floor | 226 KB peak | 10 MB peak |
|---|---|---|---|---|
| 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- en Node-baselines zijn onderling niet vergelijkbaar; de interpreter zit in beide meegeteld.
markdownify zit in het midden: een basis van 23,9 MiB en 278,5 MiB op een document van 10 MB. Dat is 3,9× de piek van html2text en ongeveer een tiende van turndown, wat de prijs is van BeautifulSoup eronder.
Kapotte HTML. Twaalf documenten die elk precies één ding breken — niet-afgesloten tags, verkeerd geneste inline-elementen, ongequote attributen met spaties, losse sluit-tags, helemaal geen <html>, dubbele attributen, een document dat halverwege een tag wordt afgekapt, ongeldige entiteiten, een onafgesloten <script>, een misleidende charset-declaratie, een commentaar met markup en 600 lagen nesting — plus twee goed gevormde controles met gelijke grootte, omdat "er kwam niets uit" alleen iets zegt over foutieve HTML als de library ook stil blijft bij een schoon document van dezelfde grootte.
markdownify gooide een fout bij 1 van de 14 en gaf 0 keer niets terug, en herstelde 30/33 sentinelwaarden over de kapotte testbestanden (malformed-results.json). Eén testbestand is van die telling uitgezonderd: volgens HTML5 is alles na een onafgesloten <script> inderdaad scriptinhoud, dus die daar verliezen is correct en het herstellen zou juist afwijken.
Voor- en nadelen
In het voordeel. Tabelnauwkeurigheid gelijk aan markitdown, geteld met dezelfde regel. Laagste tokentelling van de vier. MIT. 1,8 MiB, en bijna nul extra kosten als BeautifulSoup al in je stack zit. Snelste koude import met 0,046 s. Actief uitgebracht. Behoudt lege tabelcellen. Per element overschrijfbare conversie via MarkdownConverter. De simpele eenregelige aanroep is hier de juiste keuze.
Tegen. Hangt af van BeautifulSoup, dus op schijf is het negen keer groter dan html2text als je dat nog niet hebt. 2.235 sterren betekent een kleinere community dan turndown — minder uitgewerkte voorbeelden als je op iets vreemds stuit. Alleen Python, dus geen hulp in een Node-stack. En 42 open issues.
Wie het wel en niet zou moeten gebruiken
Begin met markdownify voor een Python-workload die op deze testbestanden lijkt. Het komt onder deze teller overeen met het aantal gegenereerde tabelrijen van markitdown, zit in de groep met de laagste tokenaantallen en is MIT. Als je BeautifulSoup al gebruikt, kan de extra installatiefvoetafdruk klein zijn; valideer wel het echte verschil in afhankelijkheden in jouw omgeving.
Overweeg html2text als je afhankelijkheidsbudget in honderden kilobytes wordt gemeten en de uitvoervorm goed werkt voor jouw pagina’s. Bekijk GPL-3.0-or-later samen met wie over licenties gaat voordat je het distribueert.
Overweeg markitdown als je al PDF’s of Office-documenten omzet. Hun HTML-resultaten hadden hier hetzelfde aantal gegenereerde tabelrijen, maar bredere nauwkeurigheid is niet als gelijkwaardig aangetoond.
Sla het over in Node, waar turndown het natuurlijke antwoord is — met turndown-plugin-gfm erbij, omdat de core van turndown zelf helemaal geen tabellen maakt.
Waar een beheerde API past
markdownify zet HTML om die je al hebt. Het haalt niets op, rendert geen JavaScript en handelt geen anti-botlaag af — geen van de vier converters doet dat, en bij veel echte targets is juist dat het lastigere deel van het werk.
Voor dezelfde testbestanden over alle vijf converters zie de vijfvoudige vergelijking van HTML naar Markdown.
Onze eigen developerstack bij Thunderbit pakt die eerdere stap aan: POST /distill haalt een URL op en geeft Markdown terug, terwijl POST /extract schema-gestructureerde JSON teruggeeft. Beide zijn beschikbaar via een MCP-server en CLI; prijzen staan op de Thunderbit-prijzenpagina. Die gehoste endpoints zijn niet tegen deze lokale converters বেenchmarkt, dus dit is een categorieverschil, geen prestatievergelijking.
De eerlijke samenvatting: als je de HTML al hebt en Markdown wilt, is markdownify gratis en doet het het hier net zo goed als de rest. Als je pagina’s moet ophalen, of rijen wilt in plaats van lopende tekst, dan koop je eigenlijk iets anders.
Voor het bredere landschap behandelt onze overzichtspagina van web scraping API’s de gehoste opties en de open-source scraper-pijler de self-hosted varianten. HTML naar Markdown omzetten in Python is de praktische handleiding.
Probeer Thunderbit voor het extraheren van webdata
Moet je markdownify gebruiken?
Voor Python is dit een sterke kandidaat als je input lijkt op deze testbestanden; test het op je eigen tabellen en foutieve pagina’s voordat je het als standaard instelt.
Het evenaart markitdown qua aantal gegenereerde tabelrijen, zit in de groep met de laagste tokenaantallen, start het snelst op in deze run en is MIT. Daartegenover gebruikte het meer geheugen dan html2text, is het alleen voor Python, en gaf het op één testbestand met kapotte HTML een fout. Schijfruimte en licentie zijn extra selectiecriteria, niet de enige argumenten.
Wat me vooral opvalt is het aantal sterren. turndown heeft vijf keer zoveel aandacht en zet out-of-the-box geen van de tabellen correct om die markdownify wel aankan. Populariteit volgt in deze categorie het gemeten gedrag niet, en juist daarom was deze vergelijking de moeite waard.
Probeer Thunderbit voor het extraheren van webdata Get Started Free
FAQ's
Is markdownify echt zo goed als markitdown voor HTML? Op deze vier testbestanden produceerden beide 36 herkenbare Markdown-tabelrijen, herstelden alle 16 gecontroleerde strings en zaten ze qua aantal tekens binnen 0,2% van elkaar. Dat is geen test op celniveau of op volledige rendering-equivalentie. markitdown verwerkt bovendien ook PDF- en Office-formaten, dus deze vergelijking gaat alleen over de gemeten HTML-uitvoer.
Heeft het BeautifulSoup nodig? Ja — dat is de parser en het grootste deel van die 1,8 MiB. Als je project BeautifulSoup al gebruikt, is de extra kost van markdownify klein. Zo niet, en schijfruimte echt telt, dan is html2text 0,2 MiB met één package, maar wel met een GPL-3.0-or-later-licentie.
Hoe gaat het om met lege tabelcellen? Het laat ze staan. In het testbestand met gaten in de data blijft de lege cel op zijn plaats, zodat elke volgende waarde in de juiste kolom blijft. Een converter die lege cellen overslaat, maakt een tabel die er nog steeds geldig uitziet maar waarbij elke waarde één kolom te ver naar links staat — juist omdat niets dat verraadt, is dat de ergste fout.
Moet ik de functie of de klasse gebruiken?
De functie markdownify() voor de standaardgevallen. MarkdownConverter als je per element wilt overschrijven hoe iets wordt omgezet — alles wat hier gemeten is, gebruikte gewoon de functie met standaardopties.
Wat is hier niet getest? Vier gedeelde testbestanden plus één tabelgerichte diagnose vormen geen representatieve corpus. De aparte foutieve-HTML-set bevatte 12 benoemde soorten breuken en twee controles, maar niet elke vorm van kapotte HTML. Geneste lijsten, definitielijsten, voetnoten, wiskunde, Markdown-naar-HTML-roundtrips, celniveau-equivalentie van tabellen en configuratievarianten zijn niet vergeleken. Ook de conversiesnelheid is niet vergeleken.


