La bibliothèque HTML vers Markdown la plus populaire ne convertit pas les tableaux

Dernière mise à jour le August 17, 2026
La bibliothèque HTML vers Markdown la plus populaire ne convertit pas les tableaux
Résumé IA
turndown était la plus étoilée des quatre bibliothèques testées au moment du relevé des métadonnées, avec 11 386 étoiles GitHub. Sur les quatre jeux HTML communs, elle a produit zéro tableau Markdown avec ses paramètres de base et a utilisé 24,6 % de jetons en plus que markdownify pour les mêmes entrées. Les quatre outils ont tous retrouvé chaque probe de contenu. Les différences portent entièrement sur la structure, et sur le coût que cette structure entraîne ensuite. Vous alimentez un modèle, ou vous stockez du contenu structuré issu de pages comme celles-ci ? Commencez avec markdownify. Il est à égalité avec markitdown sur le nombre de lignes de tableau émises selon ce compteur, se situe dans le groupe le plus économe en jetons, est sous licence MIT et s’installe en 1,8 MiB.

turndown était la plus étoilée des quatre bibliothèques testées au moment du relevé des métadonnées, avec 11 386 étoiles GitHub. Sur les quatre jeux HTML communs, elle a produit zéro tableau Markdown avec ses paramètres par défaut, et a utilisé 24,6 % de jetons en plus que markdownify pour les mêmes entrées.

Les quatre outils ont tous retrouvé l’intégralité des contenus de test. Les écarts portent entièrement sur la structure, et sur le coût que cette structure entraîne ensuite.

Ce qui a été mesuré, et sur quels jeux de données

Cette base de recherche disposait déjà d’un ensemble pour markitdown, avec cinq fichiers HTML et des chaînes de vérification préenregistrées — des chaînes exactes à retrouver, ainsi que des chaînes de type boilerplate servant à détecter les éléments de chrome de page. La comparaison agrégée utilise les quatre fichiers partagés par les quatre convertisseurs : un catalogue de librairie, un site de citations, un tableau de statistiques de hockey et l’article Wikipédia sur le web scraping. Un cinquième fichier, Nothing but tables, n’est utilisé que comme diagnostic centré sur les tableaux et est exclu du total agrégé de 24,6 %.

Les quatre : turndown 7.2.4 (Node), markdownify 1.2.3, html2text 2025.4.15, et markitdown, dont les lignes publiées sont utilisées telles quelles. Pages : un catalogue de librairie, un site de citations, un tableau de statistiques de hockey et l’article Wikipédia sur le web scraping.

Chaque nom de métrique ci-dessous correspond exactement au champ d’artefact utilisé par markitdown, de sorte que les lignes puissent être comparées directement, sans avoir à réconcilier deux définitions d’un même terme.

Le tableau

Measured results chart: Token output vs Markdown table rows

ConvertisseurTests de contenuCaractères de sortieJetons (o200k)Octets/jetonLignes de tableau MarkdownLiens
turndown16/1695,18826,2363.630611
markdownify16/1676,86821,0623.6536599
html2text16/1676,45221,1763.6132545
markitdown16/1676,99521,3363.6136598

Quatre fichiers — ceux également traités par markitdown. Les chiffres complets par fichier se trouvent dans fiveway-scores.json. Les jetons ont été comptés avec o200k_base ; les lignes de tableau de markitdown ont été recomptées à partir de son propre Markdown stocké, avec le même compteur que pour les autres.

La conservation du contenu est à égalité. Les seize probes de contenu réparties sur les quatre fichiers ont survécu dans chaque convertisseur. Si votre seule question est « le texte passe-t-il ? », ces quatre outils répondent tous oui.

La structure n’est pas à égalité. Sur les quatre fichiers communs, markdownify et markitdown produisent tous deux 36 lignes de tableau Markdown ; html2text en produit 32 ; turndown n’en produit aucune. Dans le diagnostic séparé centré sur les tableaux, markdownify a produit 62 lignes et html2text 59 ; ces lignes ne sont pas incluses dans l’agrégat ci-dessus.

Le coût en jetons est 24,6 % plus élevé avec turndown, et la raison n’est pas les tableaux. Je pensais que c’était le cas, mais les chiffres par fichier racontent autre chose — voir plus bas.

Ce que turndown fait à un tableau

Voici le fichier de statistiques de hockey, avec les mêmes données, présentées de trois façons.

turndown:

System diagram: Core Table Paths Diverge

Team Name

Year

Wins

Losses

Boston Bruins

1990

44

24

markdownify:

| Team Name | Year | Wins | Losses | ... |
| --- | --- | --- | --- | --- |
| Boston Bruins | 1990 | 44 | 24 | ... |

html2text:

Team Name  |  Year  |  Wins  |  Losses  | ...
---|---|---|---|---
Boston Bruins  |  1990  |  44  |  24  | ...

Chaque valeur survit à la conversion de turndown, ce qui explique son score de 16/16 sur les probes. Ce qui ne survit pas, c’est l’appartenance de chaque valeur à une colonne précise. En lisant la sortie de turndown, 44 n’est qu’un nombre sur une ligne ; impossible de savoir qu’il s’agit du total de victoires de Boston sans compter les positions et sans espérer qu’aucune cellule soit vide. Or, dans ce fichier, certaines cellules sont vides, donc le comptage par position ne fonctionne pas non plus.

Pour un modèle qui lit la sortie, c’est la différence entre un tableau sur lequel il peut répondre correctement et une simple liste de nombres qu’il devra deviner.

Ce n’est pas vraiment un défaut, plutôt une limite documentée : le cœur de turndown ne gère pas les tableaux, et turndown-plugin-gfm existe pour les ajouter. Mais l’installation par défaut ne l’inclut pas, et 11 386 étoiles suggèrent que beaucoup de gens utilisent cette version de base.

D’où vient vraiment l’écart de jetons

J’avais écrit le paragraphe ci-dessus en pensant que l’écart de 24,6 % venait des tableaux aplatis sous forme de caractères. Puis j’ai regardé les chiffres fichier par fichier, et ce n’est pas le cas.

Fichierjetons turndown ÷ jetons markdownify
Site de citations (sans tableaux)0,99×
Catalogue de librairie1,06×
Statistiques de hockey (un grand tableau)1,37×
Wikipédia (surtout du texte, 9 lignes de tableau)1,29×
Rien que des tableaux0,78×

Sur le fichier qui ne contient que des tableaux, turndown est 22 % moins coûteux — parce que les structures Markdown à base de barres verticales coûtent aussi des jetons, et turndown n’en génère aucune. Aplatir un tableau n’implique pas, à lui seul, une pénalité en jetons.

Le fichier Wikipédia représente 74 % du total, et contient neuf lignes de tableau. Son écart de 15 378 caractères ne peut pas venir des tableaux. Il vient de ceci :

(function(){var className="client-js vector-feature-language-in-header-enabled…
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}…
(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web…

turndown ne supprime pas le contenu des balises <script> et <style>. markdownify et html2text, eux, le font. Mesuré à l’aide de marqueurs n’apparaissant que dans ces éléments : la sortie de turndown contient 10 marqueurs script et 84 marqueurs style sur l’ensemble des fichiers ; les deux autres en contiennent zéro. Sur la page Wikipédia, huit lignes de JavaScript de configuration MediaWiki et de CSS en ligne représentent 14 644 caractères — 95 % de l’écart total (script-style-stripping.json).

C’est le résultat que j’utiliserais réellement. Un tableau aplati, c’est un problème de structure visible. Un bloc de configuration JavaScript dans votre Markdown, c’est du coût pur sans aucune information utile, et sur une page réelle il domine largement tout le reste de cette comparaison.

html2text écrit des tableaux qu’on ne reconnaît pas forcément

html2text a obtenu 32 lignes là où markdownify et markitdown en ont 36, et la première version de mon compteur ne lui en attribuait qu’une seule.

C’était ma règle de comptage, pas une limite de la bibliothèque. html2text émet Team Name | Year | Wins sans barres verticales de début et de fin — une forme Markdown courante, mais invisible pour une regex qui exige ^\|.*\|$. J’avais écrit cette regex, je l’avais exécutée, et j’étais prêt à conclure que html2text ne faisait pas de tableaux.

En réalité, si. Le compteur corrigé utilise une heuristique : une suite de lignes consécutives contenant des barres verticales, avec une ligne séparatrice à l’intérieur. Avec cette règle, html2text passe de 1 à 32. Ce n’est pas un parseur Markdown complet, donc les totaux de lignes doivent être lus comme des mesures prises avec un compteur documenté, et non comme des résultats universels de rendu.

Bon à savoir si vous post-traitez le Markdown avec vos propres regex : deux de ces quatre bibliothèques émettent des barres verticales externes, et une non.

La licence dont personne ne parle

ConvertisseurLicenceInstallationImport à froidÉtoilesDernière version
turndownMIT3 packages npm, 8,8 MiB0.056 s11,3862026-04-03
markdownifyMIT5 packages, 1,8 MiB0.046 s2,2352026-06-30
html2textGPL-3.0-or-later1 package, 0,2 MiB0.077 s2,1682025-04-15
markitdownVoir les métadonnées du packageNon mesuré dans cet essai d’installationNon mesuré

install-and-import.json. Chaque bibliothèque a été installée dans son propre environnement vide. Les licences ont été vérifiées à trois niveaux : les métadonnées du registre, le dépôt GitHub et le fichier METADATA du package installé, qui contient License-Expression: GPL-3.0-or-later.

La bibliothèque la plus légère de cette comparaison d’installation — 1 package, 0,2 MiB — est sous GPL-3.0-or-later. L’impact sur un projet dépend de la manière dont le logiciel est combiné et 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 juridique. markitdown apparaît comme non mesuré ici, car son installation et sa licence n’ont pas été capturées par cet artefact précis.

Ce compromis est facile à manquer, parce que la licence est justement la propriété qui n’apparaît pas dans un benchmark.

Les trois sont de loin plus légers que les bibliothèques d’extraction d’articles de la même catégorie — qui vont de 21 à 70 MiB. Un convertisseur est un outil beaucoup plus petit qu’un extracteur, et il est utile de les distinguer dans votre budget de dépendances.

Deux biais que j’ai dû corriger avant que ce tableau soit juste

Les chiffres ci-dessus correspondent à la troisième version. Les deux premières étaient erronées d’une manière qu’il vaut la peine de nommer, car ces erreurs sont toutes deux faciles à reproduire.

Cinq fichiers contre quatre. markitdown n’a traité que quatre de ces cinq fichiers ; les trois autres outils ont traité les cinq. Additionner les scores de chaque outil sur son propre périmètre donnait à markdownify 98 lignes de tableau contre 36 pour markitdown, ce qui laissait croire à un écart de capacité. Sur les mêmes quatre fichiers, on obtient 36 contre 36 — une égalité parfaite. Le cinquième fichier est justement celui qui contient le plus de tableaux, donc le biais partait dans le pire sens possible, gonflant presque par trois l’avantage apparent des nouveaux venus par rapport à l’outil déjà présent.

System diagram: Make the Comparison Comparable

Deux compteurs, une seule colonne. Le champ md_table_rows publié par markitdown provenait de son propre code, que je n’avais pas lu. Comparer ce nombre au mien risquait de confronter deux compteurs plutôt que deux convertisseurs. Sa sortie Markdown étant stockée sur disque, la correction consistait à appliquer un seul compteur aux quatre ; et lorsque je l’ai fait, le recompte de markitdown a donné exactement sa valeur publiée par fichier (0, 0, 27, 9). Les définitions concordaient ; je ne pouvais simplement pas le savoir sans vérifier.

Aucune de ces erreurs n’aurait été visible dans la sortie. Toutes deux auraient produit un tableau confiant mais faux.

Qui devrait utiliser quoi

Vous alimentez un modèle, ou vous stockez du contenu structuré issu de pages comme celles-ci ? Commencez avec markdownify. Il est à égalité avec markitdown sur le nombre de lignes de tableau émises selon ce compteur, se situe dans le groupe le plus économe en jetons, est sous licence MIT et s’installe en 1,8 MiB. Vérifiez-le sur vos propres types de pages avant de le standardiser.

Votre budget de dépendances se compte en kilo-octets, et vous ne distribuez pas le logiciel ? html2text. Un package, 0,2 MiB, tableaux conservés. Vérifiez d’abord la question GPL, et notez que la dernière version date d’avril 2025.

Vous êtes déjà sur une stack Node ? turndown, avec turndown-plugin-gfm installé à ses côtés — et supprimez <script> et <style> du HTML avant de lui envoyer, car turndown ne le fera pas. Ces deux omissions coûtent un quart de jetons en plus et la structure de vos tableaux, et rien de tout cela n’apparaît tant qu’on n’examine pas la sortie.

Vous convertissez déjà d’autres formats documentaires ? markitdown gère le PDF, Office et davantage encore, et sa sortie HTML est compétitive face aux convertisseurs dédiés. Une seule dépendance au lieu de deux, cela compte.

Où une API managée trouve sa place

Ces quatre outils prennent tous un HTML que vous possédez déjà. Aucun ne récupère une page, ne rend du JavaScript, ni ne gère une couche anti-bot — et sur beaucoup de cibles réelles, c’est justement la partie la plus difficile.

Notre propre stack développeur chez Thunderbit couvre cet aspect. POST /distill prend une URL et renvoie un Markdown propre, prêt pour les LLM, avec le rendu et la récupération gérés en amont ; POST /extract renvoie un JSON structuré aligné sur un schéma AI à partir d’un JSON Schema que vous fournissez, ce qui produit une autre forme de sortie — des lignes plutôt qu’un tableau Markdown qu’il faudrait ensuite parser. Les deux sont accessibles via un serveur MCP et une CLI (npx @thunderbit/thunderbit-cli). Les tarifs sont sur la page de tarification de Thunderbit.

La comparaison honnête : si vous avez déjà le HTML et que vous voulez du Markdown, markdownify est gratuit et fait très bien le travail, et ce tableau indique lesquels de ses rivaux en font autant. Si vous devez récupérer les pages, ou si vous voulez des lignes structurées plutôt qu’un texte rédigé, c’est un autre achat.

Pour une vue plus large, notre tour d’horizon des API de web scraping couvre les options hébergées, et le pilier open source des scrapers les solutions auto-hébergées. Convertir du HTML en Markdown en Python est le guide pratique, et ce que llms.txt essaie de standardiser explique où va toute cette catégorie.

Essayez Thunderbit pour l’extraction de données web

Verdict

Pour cette charge de travail sur quatre fichiers, markdownify est le meilleur choix par défaut : le même nombre de lignes de tableau émises que markitdown selon le compteur partagé, un nombre de jetons à 1,3 % près des autres convertisseurs efficaces, la licence MIT, et une installation de 1,8 MiB.

L’écart entre popularité et comportement mesuré, c’est là le vrai enseignement. turndown est une excellente bibliothèque que beaucoup de gens ont installée sans le plugin qui lui permet de gérer les tableaux, et le prix de cet oubli se traduit par un quart de jetons en plus et une structure de tableau qui n’existe plus. Aucun de ces deux chiffres n’apparaît tant qu’on ne les compte pas.

Si vous ne retenez qu’une chose : vérifiez ce que votre convertisseur fait à un tableau avant de faire confiance à sa sortie pour un modèle. Trois de ces quatre outils font quelque chose de sensé. Le plus populaire, non — sauf si vous lui demandez explicitement.

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

FAQ

Est-ce que turndown ne prend vraiment pas en charge les tableaux ? Son cœur ne le fait pas. Les tableaux viennent de turndown-plugin-gfm, un package séparé, et un simple npm install turndown ne l’inclut pas. Sans ce plugin, chaque cellule survit comme son propre paragraphe — les valeurs sont là, mais pas les relations de lignes et de colonnes. Sur quatre fichiers, cela a produit zéro ligne de tableau Markdown et 24,6 % de jetons en plus que markdownify pour le même contenu.

Pourquoi html2text semblait-il n’avoir aucun tableau au début ? Parce que mon compteur exigeait des barres verticales au début et à la fin, et html2text ne les émet pas. Team Name | Year | Wins est du Markdown valide et s’affiche correctement ; c’est simplement un style différent de | Team Name | Year |. Le compteur corrigé cherche une suite de lignes contenant des barres verticales avec une ligne séparatrice, comme le ferait un parseur, et html2text passe de 1 ligne à 32. Si vous post-traitez du Markdown avec vos propres regex, c’est ce détail qui vous piégera.

La licence GPL de html2text pose-t-elle vraiment problème ? Cela dépend de la façon dont vous combinez et distribuez le logiciel. GPL-3.0-or-later peut créer des obligations que la MIT n’impose pas, donc impliquez la personne en charge des licences avant de le choisir pour un produit distribué. Il s’agit d’un point de conformité, pas d’un avis juridique ; l’identité de la licence a été confirmée via les métadonnées du registre, le dépôt et le fichier METADATA du package installé.

Ces comptes de jetons ont-ils une valeur pour d’autres pages ? L’écart de 24,6 % vient surtout du fait que turndown conserve le contenu des balises <script> et <style>, donc il varie selon la quantité présente sur une page — importante sur un CMS moderne, quasi nulle sur une page statique. Les tableaux tirent dans l’autre sens : sur le fichier qui ne contenait que des tableaux, turndown s’est révélé 22 % moins cher, parce qu’il n’émet aucune structure à base de barres verticales. Les octets par jeton se situaient entre 3,61 et 3,65 pour les quatre outils, donc la densité de sortie est la même partout et la différence vient de la quantité. Mesurez votre propre corpus si le chiffre doit servir de base budgétaire.

Qu’est-ce qui n’a pas été testé ici ? La diversité du monde réel — quatre fichiers, ce sont quatre fichiers. Les listes imbriquées, les listes de définitions, les notes de bas de page et les formules mathématiques. Le HTML mal formé, là où les convertisseurs divergent historiquement le plus. Le round-trip du Markdown vers HTML. docling, qui dispose des mêmes fichiers sur disque mais dont l’exécution publiée ne rapporte pas ces champs, d’où son absence plutôt qu’une estimation. Et la configuration : html2text a été exécuté avec body_width=0, car sa valeur par défaut de 78 provoque un retour à la ligne dur sur chaque ligne, ce qui aurait changé tous les caractères et tous les comptes de jetons de ce tableau.

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