markdownify égale markitdown sur le nombre de lignes de tableaux générées, pour seulement 1,8 MiB

Dernière mise à jour le August 17, 2026
markdownify égale markitdown sur le nombre de lignes de tableaux générées, pour seulement 1,8 MiB
Résumé IA
Sur les quatre jeux de tests HTML partagés avec markitdown, markdownify a produit exactement le même nombre de lignes de tableaux Markdown générées selon notre compteur — 36 contre 36 — et a retrouvé les 16 chaînes de contenu vérifiées. Sa sortie de 21 062 tokens était, sur le papier, la plus faible, même si les trois premiers convertisseurs restaient à moins de 1,3 % d’écart. Il s’installe pour 1,8 MiB, est sous licence MIT, et affichait 2 235 étoiles GitHub au moment de l’instantané. C’est la bibliothèque la moins discutée de cette catégorie et, au vu de ces chiffres, celle que je choisirais. Commencez avec markdownify pour une charge Python ressemblant à ces jeux de tests.

Sur les quatre jeux de tests HTML partagés avec markitdown, markdownify a produit exactement le même nombre de lignes de tableaux Markdown générées, selon notre compteur — 36 contre 36 — et a retrouvé les 16 chaînes de contenu vérifiées. Son résultat de 21 062 tokens était, sur le papier, le plus faible, même si les trois premiers convertisseurs restaient à moins de 1,3 % d’écart. Il s’installe pour 1,8 MiB, est sous licence MIT, et affichait 2 235 étoiles GitHub au moment de l’instantané.

C’est sans doute la bibliothèque la moins citée de cette catégorie, et, au vu de ces chiffres, celle que je choisirais.

Qu’est-ce que markdownify ?

markdownify est un convertisseur Python de HTML vers Markdown basé sur BeautifulSoup. Toute son architecture tient en une phrase : analyser avec BeautifulSoup, parcourir l’arborescence, puis produire du Markdown. Version testée : 1.2.3, licence MIT, 2 235 étoiles, 42 problèmes ouverts, dernière publication le 2026-06-30 — projet actif, 44 versions.

Référence officielle : dépôt officiel de python-markdownify.

System diagram: HTML to Markdown Path

L’API tient en une fonction :

from markdownify import markdownify
md = markdownify(html)

Il existe aussi une classe (MarkdownConverter) si vous souhaitez redéfinir le traitement de certains éléments, ainsi qu’un ensemble d’options utiles — style des titres, caractères de puces, détection du langage du code, suppression d’éléments. Mais l’usage le plus courant reste l’appel en une ligne, qui fonctionne très bien.

pip install markdownify installe 5 paquets pour 1,8 MiB, et l’import à froid prend 0,046 s — le plus rapide des trois convertisseurs testés ici. Son arbre de dépendances repose sur BeautifulSoup et ses compagnons habituels, déjà présents dans de nombreux projets Python, ce qui rend souvent le coût marginal presque nul.

La mesure

Je l’ai exécuté sur les quatre jeux de tests HTML déjà utilisés dans ce corpus pour markitdown, avec les chaînes de vérification préenregistrées de ce jeu — 16 chaînes exactes du corps de page à conserver, plus des contrôles sur le contenu décoratif de la page. Un cinquième jeu, Nothing but tables, est un diagnostic distinct centré sur les tableaux et n’est pas inclus dans l’agrégat à quatre jeux ci-dessous.

ConvertisseurVérifications du corpsCaractères en sortieTokens (o200k)Lignes de tableaux MarkdownLiens
markdownify16/1676 86821 06236599
html2text16/1676 45221 17632545
markitdown16/1676 99521 33636598
turndown16/1695 18826 2360611

fourway-scores.json. Quatre jeux de tests, tokens comptés avec o200k_base, lignes de tableaux comptées avec une règle unique sur l’ensemble des quatre — y compris un recomptage de la sortie stockée de markitdown, qui correspondait exactement à la valeur publiée.

Trois points ressortent.

Il est à égalité avec markitdown sur le nombre de lignes de tableaux générées. 36 lignes chacun sur les quatre jeux partagés, comptées par la même heuristique. Cela ne prouve pas une équivalence cellule par cellule ; cela signifie simplement que les deux sorties exposent le même nombre de lignes de tableaux Markdown reconnaissables pour ce compteur.

Il affiche le plus faible nombre de tokens. 21 062, légèrement sous les 21 176 de html2text et les 21 336 de markitdown, et 19,7 % sous les 26 236 de turndown. Les trois premiers sont à moins de 1,3 % d’écart, ce que je qualifierais plutôt d’égalité que de victoire ; l’écart qui compte est celui avec turndown.

Tous les contenus vérifiés ont survécu. Les 16. C’était aussi le cas pour les trois autres — la survie du contenu n’est pas ce qui différencie ces bibliothèques.

Le tableau qu’il restitue correctement

Le jeu de statistiques de hockey est celui qui sépare les convertisseurs. markdownify :

| Nom de l’équipe | Année | Victoires | Défaites | Défaites en prolongation | % de victoires | ... |
| --- | --- | --- | --- | --- | --- | --- |
| Boston Bruins | 1990 | 44 | 24 |  | 0.55 | ... |

Un GFM standard avec des barres verticales en ouverture et en fermeture, une ligne de séparation, et — notez la cellule vide entre 24 et 0.55il conserve la cellule vide au lieu de la supprimer. Cela peut sembler anodin, mais ce ne l’est pas : un convertisseur qui ignore les cellules vides décale toutes les valeurs suivantes d’une colonne, tout en produisant un tableau qui a pourtant l’air correct.

System diagram: Preserve Table Meaning

turndown, sur la même entrée, transforme chaque valeur en paragraphe isolé, sans aucune structure de colonnes. html2text génère un tableau correct, mais dans un autre style, sans les barres extérieures.

Si le Markdown est destiné à un modèle, ce sont justement les barres et la cellule vide préservée qui lui permettent de répondre « combien de matchs Boston a-t-il perdus » au lieu de deviner.

Deux éléments qu’il supprime et que turndown conserve

La fidélité des tableaux saute aux yeux. Ce point est plus important, et presque personne ne le souligne.

markdownify supprime le contenu des balises <script> et <style>. turndown ne le fait pas. Compté par des marqueurs présents uniquement dans ces éléments, la sortie de markdownify sur l’ensemble des jeux affiche zéro marqueur de script et zéro marqueur de style ; celle de turndown en affiche 10 et 84. Sur le jeu Wikipedia, cela fait la différence entre 59 561 caractères et 74 939 — et huit lignes de configuration JavaScript inline MediaWiki et de CSS représentent 14 644 caractères, soit 95 % de cet écart (script-style-stripping.json).

Pour tout flux destiné à un modèle, c’est la chose la plus coûteuse de toute cette comparaison : un bloc de configuration JavaScript consomme des tokens sans apporter la moindre information. markdownify le retire sans qu’on lui demande. html2text aussi.

Par jeu de test, markdownify et html2text s’accordent exactement lorsque le tableau est simple, et divergent lorsqu’il ne l’est pas :

Jeu de testmarkdownifyhtml2text
Statistiques de hockey27 lignes27 lignes
Wikipedia9 lignes5 lignes
Nothing but tables (diagnostic séparé)62 lignes59 lignes

markdownify génère davantage de lignes reconnues sur les deux comparaisons de diagnostic. Sur Wikipedia en particulier, il en conserve neuf là où html2text n’en garde que cinq selon ce compteur. C’est un bon rappel qu’il faut inspecter des tableaux imbriqués et irréguliers représentatifs avant de choisir, mais cela ne prouve pas que chaque cellule produite est sémantiquement juste.

Installation et licence, face aux alternatives

BibliothèquePaquetsDisqueImport à froidLicenceÉtoilesDernière version
markdownify51,8 MiB0,046 sMIT2 2352026-06-30
html2text10,2 MiB0,077 sGPL-3.0-or-later2 1682025-04-15
turndown3 (npm)8,8 MiB0,056 sMIT11 3862026-04-03

Référence officielle : markdownify sur PyPI.

install-and-import.json et metadata-snapshot.json. Chaque bibliothèque a été installée dans son propre environnement vide.

html2text occupe neuf fois moins d’espace disque, mais il est GPL-3.0-or-later. Pour un produit distribué, considérez cela comme un point de contrôle pour la personne en charge des aspects juridiques ; cet article ne constitue pas un avis légal. markdownify est sous MIT, ce qui est généralement plus permissif, mais cela doit quand même entrer dans l’examen de conformité habituel.

Les 1,8 MiB sont aussi en partie théoriques si votre projet utilise déjà BeautifulSoup, ce qui est le cas de beaucoup de projets Python de scraping — dans cette situation, markdownify revient presque à zéro coût supplémentaire.

Le rythme des versions de markdownify est le plus sain des trois : 44 publications et une mise à jour six semaines avant les tests, contre la dernière publication de html2text en avril 2025.

Ce qu’une seule ligne de Python vous apporte vraiment

Toute la bibliothèque se résume à markdownify(html), et il vaut la peine d’être précis sur ce que cet appel décide à votre place, car trois de ces décisions sont précisément celles qui ont été évaluées ici.

Il analyse avec BeautifulSoup, retire <script> et <style> sans qu’on le lui demande, et génère des tableaux GFM avec barres verticales externes et cellules vides conservées. L’historique du parseur ne garantit pas à lui seul un comportement satisfaisant sur du HTML cassé, c’est pourquoi cette question est mesurée séparément plus bas.

Rien de tout cela n’est un réglage que vous devez activer. C’est le comportement par défaut, et dans une catégorie où turndown conserve le JavaScript par défaut et où html2text coupe automatiquement les lignes à 78 caractères, une bibliothèque qui fonctionne correctement dès l’installation a une vraie valeur.

Les options existent si vous en avez besoin — heading_style, bullets, code_language, strip et convert pour les listes d’éléments autorisés ou interdits, ainsi que MarkdownConverter pour les surcharges élément par élément. Rien de ce qui a été mesuré ici n’utilisait ces options.

Mémoire, et impact du HTML cassé

Measured results chart: markdownify: memory and malformed input

Le contexte global des tests de résistance figure dans la comparaison sur dix bibliothèques entre mémoire et HTML mal formé.

Deux éléments que chaque revue de cette série signalait comme non testés sont désormais mesurés.

Pic de mémoire résidente, via /usr/bin/time -l, un nouveau processus par cellule — le plancher d’import correspond au coût de chargement et d’inactivité de la bibliothèque ; les pics incluent le document.

BibliothèqueRuntimePlancher d’importPic à 226 KBPic à 10 MB
html2textpython3.1418.719.971.2
pyquerypython3.1430.333.9172.5
resiliparsepython3.1420.525.1225.1
markdownifypython3.1423.928.9278.5
goose3python3.1444.152.4398.5
cheerionode2266.876.5398.5
justextpython3.1430.336.6431.2
newspaper4kpython3.1452.661.8668.5
trafilaturapython3.1452.564.8927.1
turndownnode2247.868.42947.1

memory-results.json. Les références de base Python et Node ne sont pas directement comparables entre elles ; l’interpréteur est inclus dans les deux.

markdownify se situe au milieu : un plancher à 23,9 MiB et 278,5 MiB pour un document de 10 MB. C’est 3,9 fois le pic de html2text et environ un dixième de celui de turndown, ce qui est le prix à payer pour s’appuyer sur BeautifulSoup.

HTML cassé. Douze documents qui cassent chacun exactement une chose — balises non fermées, imbrication incorrecte d’éléments inline, attributs non quotés contenant des espaces, balises de fermeture orphelines, absence totale de <html>, attributs en double, document tronqué en plein milieu d’une balise, entités invalides, <script> non fermé, déclaration d’encodage mensongère, commentaire contenant du balisage, et 600 niveaux d’imbrication — plus deux contrôles valides de taille équivalente, parce que « il n’a rien renvoyé » ne dit quelque chose sur le malformé que si la bibliothèque reste également silencieuse sur un document propre de même taille.

markdownify a levé une erreur sur 1 document sur 14 et n’a rien renvoyé sur 0, en récupérant 30/33 sentinelles sur les jeux cassés (malformed-results.json). Un jeu est exclu de ce compte : selon HTML5, tout ce qui suit un <script> non fermé fait partie du script ; perdre ce contenu est donc correct, et le récupérer constituerait l’écart.

Avantages et inconvénients

Points forts. Fidélité des tableaux égale à markitdown, mesurée par la même règle. Plus faible nombre de tokens parmi les quatre. MIT. 1,8 MiB, et coût marginal proche de zéro si BeautifulSoup est déjà présent dans votre arborescence. Import à froid le plus rapide, à 0,046 s. Publié activement. Conserve les cellules vides des tableaux. Conversion par élément modifiable via MarkdownConverter. L’appel simple en une ligne est le bon choix.

Points faibles. Dépend de BeautifulSoup, donc occupe neuf fois plus de place que html2text si vous ne l’avez pas déjà. 2 235 étoiles signifient une communauté plus petite que celle de turndown — donc moins d’exemples pratiques face à un cas bizarre. Uniquement Python, donc inutile dans une pile Node. Et 42 problèmes ouverts.

Qui devrait l’utiliser, et qui devrait l’éviter

Commencez avec markdownify pour une charge Python ressemblant à ces jeux de tests. Il égale markitdown sur le nombre de lignes émises selon ce compteur, se trouve dans le groupe au plus faible nombre de tokens, et est sous MIT. Si vous dépendez déjà de BeautifulSoup, son empreinte d’installation marginale peut être faible ; vérifiez le surcoût réel des dépendances dans votre environnement.

Envisagez plutôt html2text si votre budget de dépendances se compte en centaines de kilo-octets et si le format de sortie vous convient. Examinez la licence GPL-3.0-or-later avec la personne responsable de la conformité avant toute distribution.

Envisagez markitdown si vous convertissez déjà des PDF ou des documents Office. Leurs résultats HTML affichaient ici le même nombre de lignes générées, mais la fidélité globale n’a pas été démontrée comme équivalente.

Passez votre chemin dans un environnement Node, où turndown est la réponse naturelle — avec turndown-plugin-gfm installé à côté, car le cœur de turndown ne produit aucun tableau.

Où une API managée trouve sa place

markdownify convertit du HTML que vous possédez déjà. Il ne récupère pas de pages, n’exécute pas de JavaScript, ne gère pas de protection anti-bot — aucun des quatre convertisseurs ne le fait, et sur beaucoup de cibles réelles, c’est cette première moitié du travail qui est la plus difficile.

Pour les mêmes jeux de tests sur les cinq convertisseurs, voir la comparaison HTML vers Markdown en cinq voies.

Notre propre pile développeur chez Thunderbit prend en charge cette tâche en amont : POST /distill récupère une URL et renvoie du Markdown, tandis que POST /extract renvoie du JSON structuré selon un schéma. Les deux sont accessibles via un serveur MCP et une CLI ; la tarification figure sur la page des tarifs Thunderbit. Ces endpoints hébergés n’ont pas été benchmarkés face à ces convertisseurs locaux : il s’agit donc d’une distinction de catégorie, pas d’une comparaison de performance.

En toute honnêteté : si vous avez déjà le HTML et que vous voulez du Markdown, markdownify est gratuit et fait le travail aussi bien que n’importe quel autre ici. Si vous récupérez les pages, ou si vous voulez des lignes plutôt que du texte, on change de besoin.

Pour aller plus loin, notre tour d’horizon des API de web scraping couvre les solutions hébergées, et le pilier open source des scrapers couvre les solutions auto-hébergées. Convertir du HTML en Markdown en Python propose un guide pratique.

Essayez Thunderbit pour l’extraction de données web

Faut-il utiliser markdownify ?

En Python, c’est un très bon candidat si vos entrées ressemblent à ces jeux de tests ; testez-le sur vos propres tableaux et vos pages mal formées avant d’en faire le choix par défaut.

Il est à égalité avec markitdown sur le nombre de lignes de tableaux générées, appartient au groupe au plus faible nombre de tokens, démarre le plus vite dans cette série, et est sous MIT. En contrepartie, il consomme plus de mémoire que html2text, ne fonctionne qu’en Python, et a levé une erreur sur un jeu de tests de HTML mal formé. Le disque et la licence sont d’autres critères de sélection, pas les seuls arguments.

Ce qui m’interpelle, c’est le nombre d’étoiles. turndown bénéficie de cinq fois plus d’attention et, par défaut, ne convertit aucun des tableaux que markdownify gère correctement. Dans cette catégorie, la popularité ne reflète pas le comportement mesuré — et c’est précisément ce qui rendait cette comparaison nécessaire.

Essayez Thunderbit pour l’extraction de données web Get Started Free

FAQ

markdownify est-il vraiment aussi bon que markitdown sur le HTML ? Sur ces quatre jeux de tests, ils ont chacun produit 36 lignes de tableaux Markdown reconnues, conservé les 16 chaînes vérifiées, et généré des sorties dont le nombre de caractères variait de seulement 0,2 %. Ce n’est ni un test cellule par cellule ni un test d’équivalence visuelle. markitdown gère aussi les formats PDF et Office, donc cette comparaison ne porte que sur les sorties HTML mesurées.

A-t-il besoin de BeautifulSoup ? Oui — c’est son parseur, et cela représente la majeure partie des 1,8 MiB. Si votre projet utilise déjà BeautifulSoup, le coût marginal de markdownify est faible. Sinon, et si l’espace disque compte vraiment, html2text fait 0,2 MiB avec un seul paquet, au prix d’une licence GPL-3.0-or-later.

Comment gère-t-il les cellules vides des tableaux ? Il les conserve. Dans le jeu de tests avec des trous dans les données, la sortie garde la cellule vide à sa place, de sorte que chaque valeur suivante reste dans la bonne colonne. Un convertisseur qui saute les cellules vides produit un tableau qui semble correct mais décale tout d’une colonne vers la gauche, ce qui est le pire échec possible puisqu’aucun signal ne l’indique.

Dois-je utiliser la fonction ou la classe ? La fonction markdownify() pour le cas standard. MarkdownConverter lorsque vous devez modifier la conversion d’un élément précis — toutes les mesures ici ont été faites avec la fonction simple et ses options par défaut.

Qu’est-ce qui n’a pas été testé ici ? Quatre jeux partagés plus un diagnostic centré sur les tableaux ne constituent pas un corpus représentatif. La suite séparée sur le HTML mal formé couvrait 12 corruptions nommées et deux contrôles, mais pas toutes les formes possibles de HTML cassé. Les listes imbriquées, les listes de définitions, les notes de bas de page, les équations, les allers-retours Markdown vers HTML, l’équivalence cellule par cellule des tableaux et les variantes de configuration n’ont pas été comparés. La vitesse de conversion non plus.

Ke
Ke
CTO chez Thunderbit | Data Scientist senior et expert en ML Forte d’une expérience de près de dix ans en machine learning et en data science, Ke Shen est diplômé de Columbia University et ancien Data Scientist senior chez Walmart Labs. Grâce à une expertise approfondie, reconnue par ses pairs, en Python, R, Java et statistiques, il partage des analyses éprouvées sur le passage d’algorithmes d’IA complexes de la théorie à une architecture prête pour la production.
Table des matières
Thunderbit · Agent IA de données web

Extrayez des données de n'importe quelle page en 1 clic

Approuvé par plus de 250 000 utilisateurs
formule gratuite disponible
De la page web au tableur
Décris ce dont tu as besoin — l'agent IA de Thunderbit l'extrait et l'exporte vers Excel, Google Sheets, Airtable ou Notion. Gratuit pour commencer.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week