markdownify ha eguagliato markitdown nel numero di righe tabellari Markdown generate, con soli 1,8 MiB

Ultimo aggiornamento il August 17, 2026
markdownify ha eguagliato markitdown nel numero di righe tabellari Markdown generate, con soli 1,8 MiB
Riepilogo AI
Sui quattro fixture HTML condivisi con markitdown, markdownify ha prodotto lo stesso numero di righe di tabella Markdown rilevate dal nostro contatore — 36 contro 36 — e ha recuperato tutte le 16 stringhe di contenuto verificate. Il suo output da 21.062 token è risultato nominalmente il più basso, anche se i primi tre convertitori restavano entro l’1,3%. Si installa in 1,8 MiB, è distribuito con licenza MIT e, al momento dello snapshot, contava 2.235 stelle su GitHub. È la libreria meno citata di questa categoria e, sulla base di questi numeri, quella che sceglierei io. Inizia da markdownify per un carico di lavoro Python simile a questi fixture.

Sui quattro fixture HTML condivisi con markitdown, markdownify ha prodotto lo stesso numero di righe di tabella Markdown rilevate dal nostro contatore — 36 contro 36 — e ha recuperato tutte le 16 stringhe di contenuto verificate. Il suo output da 21.062 token è risultato nominalmente il più basso, anche se i primi tre convertitori restavano entro l’1,3%. Si installa in 1,8 MiB, è distribuito con licenza MIT e, al momento dello snapshot, contava 2.235 stelle su GitHub.

È la libreria meno citata di questa categoria e, sulla base di questi numeri, quella che sceglierei io.

Cos’è markdownify

markdownify è un convertitore Python da HTML a Markdown basato su BeautifulSoup. L’architettura è tutta qui: analizza con BeautifulSoup, percorre l’albero DOM, genera Markdown. Versione testata: 1.2.3, licenza MIT, 2.235 stelle, 42 issue aperte, ultimo rilascio il 2026-06-30 — progetto attivamente mantenuto, 44 release.

Riferimento ufficiale: repository ufficiale di python-markdownify.

System diagram: HTML to Markdown Path

L’API è una sola funzione:

from markdownify import markdownify
md = markdownify(html)

Esiste anche una forma a classe (MarkdownConverter) se vuoi sovrascrivere il comportamento di elementi specifici, oltre a un buon set di opzioni — stile dei titoli, caratteri elenco puntato, rilevamento del linguaggio nei blocchi di codice, rimozione di elementi. Ma il caso d’uso più comune è la chiamata in una riga, e funziona.

pip install markdownify scarica 5 pacchetti per 1,8 MiB, e il cold import richiede 0,046 s — il più veloce tra i tre convertitori che ho testato. L’albero delle dipendenze ruota attorno a BeautifulSoup e ai suoi compagni abituali, che molti progetti Python già includono, quindi il costo incrementale è spesso vicino a zero.

La misurazione

L’ho eseguito sui quattro fixture HTML che un altro pacchetto di questa base aveva già usato per markitdown, con le sue stringhe probe pre-registrate — 16 stringhe esatte nel body da verificare per la sopravvivenza, più controlli di boilerplate per la struttura della pagina. Un quinto fixture, Nothing but tables, è un test separato molto orientato alle tabelle ed è escluso dall’aggregato dei quattro fixture qui sotto.

ConverterBody probesOutput charsTokens (o200k)Markdown table rowsLinks
markdownify16/1676,86821,06236599
html2text16/1676,45221,17632545
markitdown16/1676,99521,33636598
turndown16/1695,18826,2360611

fourway-scores.json. Quattro fixture, token contati con o200k_base, righe di tabella contate con la stessa regola su tutti e quattro — incluso un nuovo conteggio dell’output archiviato di markitdown, che ha coinciso esattamente con il valore pubblicato.

Tre cose saltano all’occhio.

Pareggia con markitdown nel conteggio delle righe di tabella generate. 36 righe ciascuno sui quattro fixture condivisi, contate con la stessa euristica. Questo non prova l’equivalenza cella per cella; significa che entrambi gli output espongono allo stesso contatore lo stesso numero di righe Markdown riconoscibili.

Ha il numero di token più basso. 21.062, leggermente sotto i 21.176 di html2text e i 21.336 di markitdown, e il 19,7% in meno rispetto ai 26.236 di turndown. I primi tre sono entro l’1,3% l’uno dall’altro, quindi li considererei in parità più che in competizione; il divario davvero rilevante è con turndown.

Ogni probe di contenuto è sopravvissuto. Tutte e 16. Lo stesso vale per gli altri tre — la sopravvivenza del contenuto non è il punto in cui queste librerie si distinguono.

La tabella che rende bene

Il fixture con le statistiche hockey è il punto in cui i convertitori si separano. markdownify:

| Team Name | Year | Wins | Losses | OT Losses | Win % | ... |
| --- | --- | --- | --- | --- | --- | --- |
| Boston Bruins | 1990 | 44 | 24 |  | 0.55 | ... |

GFM standard con pipe iniziali e finali, una riga separatrice e — nota la cella vuota tra 24 e 0.55emette la cella vuota invece di saltarla. Sembra una banalità, ma non lo è: un convertitore che elimina le celle vuote sposta tutti i valori successivi nella colonna sbagliata, pur facendo sembrare l’output una tabella valida.

System diagram: Preserve Table Meaning

turndown sullo stesso input trasforma ogni valore in un paragrafo separato, senza alcuna struttura di colonne. html2text produce una tabella corretta ma con uno stile diverso, senza le pipe esterne.

Se il Markdown finirà in un modello, le pipe e la cella vuota preservata sono ciò che gli permette di rispondere “quante partite ha perso Boston” invece di tirare a indovinare.

Due cose che rimuove e che turndown non rimuove

La fedeltà delle tabelle è la differenza visibile. Questa è più importante, e quasi nessuno la cita.

markdownify elimina il contenuto di <script> e <style>. turndown no. Conteggiando i marker che compaiono solo dentro quegli elementi, l’output di markdownify sui fixture contiene zero marker script e zero marker style; quello di turndown ne contiene 10 e 84. Nel fixture Wikipedia questa differenza separa 59.561 caratteri da 74.939 — e otto righe di configurazione JavaScript inline e CSS di MediaWiki rappresentano 14.644 caratteri, il 95% di quel divario (script-style-stripping.json).

Per tutto ciò che alimenta un modello, questo è l’elemento più costoso dell’intero confronto: un blob di configurazione JavaScript consuma token e non porta alcuna informazione utile. markdownify lo elimina automaticamente. Anche html2text fa lo stesso.

Per fixture, markdownify e html2text coincidono esattamente dove la tabella è semplice e divergono dove non lo è:

Fixturemarkdownifyhtml2text
Hockey statistics27 rows27 rows
Wikipedia9 rows5 rows
Nothing but tables (separate diagnostic)62 rows59 rows

markdownify genera più righe riconosciute in entrambi i confronti diagnostici. In particolare su Wikipedia mantiene nove righe dove html2text, con questo contatore, ne conserva cinque. È un segnale utile per controllare bene tabelle annidate e irregolari prima di scegliere, non una prova che ogni cella emessa sia semanticamente corretta.

Installazione e licenza, a confronto con le alternative

LibraryPackagesDiskCold importLicenceStarsLast release
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

Riferimento ufficiale: markdownify su PyPI.

install-and-import.json e metadata-snapshot.json. Ogni libreria è stata installata in un proprio ambiente vuoto.

html2text è nove volte più piccolo su disco, ma è GPL-3.0-or-later. Per un prodotto distribuito, è un punto da verificare con chi si occupa della licenza; questo articolo non è consulenza legale. markdownify è MIT, quindi in genere più permissivo, ma va comunque incluso nella normale revisione di compliance.

Gli 1,8 MiB sono anche in parte nominali se il tuo progetto usa già BeautifulSoup, cosa che accade in moltissimi progetti Python di scraping — in quel caso markdownify costa quasi zero.

Il ritmo dei rilasci di markdownify è il più sano tra i tre: 44 release e un aggiornamento sei settimane prima del test, contro l’ultimo rilascio di html2text nell’aprile 2025.

Cosa ottieni davvero con una riga di Python

L’intera libreria è markdownify(html), ed è utile essere espliciti su ciò che questa chiamata decide al posto tuo, perché tre di queste decisioni sono proprio quelle al centro del confronto.

Usa BeautifulSoup per il parsing, rimuove <script> e <style> senza che tu lo chieda, ed emette tabelle in stile GFM con pipe esterne e celle vuote preservate. Il pedigree del parser da solo non garantisce il comportamento su input malformati, quindi quella domanda viene misurata separatamente qui sotto.

Nessuna di queste cose è un’opzione che devi impostare. È il comportamento predefinito, e in una categoria in cui il default di turndown mantiene il JavaScript e quello di html2text va a capo forzando le righe a 78 caratteri, una libreria che funziona bene già “out of the box” ha un valore concreto.

Le opzioni ci sono, se servono — heading_style, bullets, code_language, strip e convert per allowlist e denylist degli elementi, e MarkdownConverter per override per singolo elemento. Tutto ciò che è stato misurato qui non ne ha usata nessuna.

Memoria e cosa fa l’HTML rotto

Measured results chart: markdownify: memory and malformed input

Il contesto più ampio dei test di stress è nel confronto su memoria e HTML malformato tra dieci librerie.

Due aspetti che ogni recensione di questo lotto indicava come non testati, ora sono misurati.

Memoria massima residente, tramite /usr/bin/time -l, un processo nuovo per cella — il floor dell’import è il costo della libreria caricata e inattiva, i picchi includono il documento.

LibraryRuntimeImport floor226 KB peak10 MB peak
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. I baseline di Python e Node non sono confrontabili tra loro; l’interprete è incluso in entrambi.

markdownify si colloca nel mezzo: 23,9 MiB di base e 278,5 MiB su un documento da 10 MB. È 3,9 volte il picco di html2text e circa un decimo di quello di turndown, ed è il compromesso richiesto da BeautifulSoup sotto il cofano.

HTML rotto. Dodici documenti, ciascuno con un solo tipo di rottura — tag non chiusi, elementi inline mal annidati, attributi senza virgolette con spazi, tag di chiusura fuori posto, assenza di <html>, attributi duplicati, documento troncato a metà tag, entità errate, uno <script> non chiuso, una dichiarazione di charset falsa, un commento che contiene markup e 600 livelli di annidamento — più due controlli ben formati di dimensioni corrispondenti, perché “non ha restituito nulla” dice qualcosa sulla malformazione solo se la libreria non tace anche su un documento pulito della stessa dimensione.

markdownify ha generato un errore in 1 su 14 e non ha restituito nulla in 0, recuperando 30/33 sentinelle nei fixture rotti (malformed-results.json). Un fixture è escluso da questo conteggio: secondo HTML5, tutto ciò che segue uno <script> non chiuso è contenuto dello script, quindi perderlo in quel caso è corretto e recuperarlo sarebbe la deviazione.

Pro e contro

A favore. Fedeltà delle tabelle pari a markitdown, conteggiata con la stessa regola. Token count più basso dei quattro. MIT. 1,8 MiB, e costo marginale quasi nullo se BeautifulSoup è già nel tuo albero dipendenze. Cold import più veloce con 0,046 s. Rilasci attivi. Conserva le celle vuote delle tabelle. Conversione per elemento modificabile tramite MarkdownConverter. La chiamata semplice in una riga è la scelta giusta.

Contro. Dipende da BeautifulSoup, quindi occupa nove volte il disco di html2text se non ce l’hai già. 2.235 stelle significano una community più piccola di quella di turndown — meno esempi pratici quando incontri un caso strano. Solo Python, quindi inutile in uno stack Node. E 42 issue aperte.

Chi dovrebbe usarlo e chi no

Inizia da markdownify per un carico di lavoro Python simile a questi fixture. Pareggia con markitdown nel conteggio delle righe generate secondo questo contatore, si colloca nel cluster con meno token ed è MIT. Se già dipendi da BeautifulSoup, il footprint incrementale potrebbe essere ridotto; verifica il delta reale delle dipendenze nel tuo ambiente.

Valuta html2text se il budget per le dipendenze si misura in centinaia di kilobyte e la forma dell’output funziona per le tue pagine. Prima della distribuzione, fai valutare la licenza GPL-3.0-or-later da chi gestisce il licensing.

Valuta markitdown se stai già convertendo PDF o documenti Office. Qui il loro output HTML ha generato lo stesso conteggio di righe, ma non è stata dimostrata una fedeltà più ampia equivalente.

Saltalo in Node, dove turndown è la risposta naturale — con turndown-plugin-gfm installato insieme, perché il core di turndown non produce alcuna tabella.

Dove si inserisce una API gestita

markdownify converte HTML che hai già in mano. Non recupera pagine, non esegue JavaScript, non gestisce anti-bot layer — nessuno dei quattro convertitori lo fa, e su molti target reali questa è la metà più difficile del lavoro.

Per gli stessi fixture su tutti e cinque i convertitori, vedi il confronto HTML-to-Markdown a cinque vie.

Il nostro stack per sviluppatori in Thunderbit affronta quel lavoro a monte: POST /distill recupera una URL e restituisce Markdown, mentre POST /extract restituisce JSON strutturato secondo schema. Entrambi sono disponibili tramite server MCP e CLI; i prezzi sono nella pagina prezzi di Thunderbit. Questi endpoint hosted non sono stati confrontati con questi convertitori locali, quindi questa è una distinzione di categoria, non un confronto prestazionale.

In modo diretto: se possiedi già l’HTML e vuoi Markdown, markdownify è gratuito e fa il lavoro bene quanto qualsiasi altra opzione qui. Se invece devi recuperare le pagine, o ti servono righe invece di testo, stai comprando qualcos’altro.

Per il panorama più ampio, la nostra rassegna delle web scraping API copre le opzioni hosted e il pillar degli scraper open source quelle self-hosted. Convertire HTML in Markdown in Python è la guida pratica.

Prova Thunderbit per l'estrazione di dati web

Dovresti usare markdownify?

Per Python, è un candidato forte quando gli input assomigliano a questi fixture; provalo sulle tue tabelle e sulle tue pagine malformate prima di renderlo il default.

Pareggia con markitdown nel numero di righe tabellari generate, si colloca nel cluster con meno token, in questo test è stato il più veloce all’import ed è MIT. Di contro, usa più memoria di html2text, funziona solo in Python e ha generato un errore su un fixture con input malformato. Dimensioni su disco e licenza sono ulteriori criteri di scelta, non gli unici.

Ciò che colpisce è il numero di stelle. turndown ha cinque volte più attenzione e, out of the box, non converte correttamente nessuna delle tabelle che markdownify gestisce bene. In questa categoria la popolarità non segue il comportamento misurato, ed è soprattutto per questo che valeva la pena fare questo confronto.

Prova Thunderbit per l'estrazione di dati web Get Started Free

FAQ

markdownify è davvero buono quanto markitdown sull’HTML? Su questi quattro fixture, hanno generato 36 righe Markdown di tabella riconosciute ciascuno, hanno recuperato tutte le 16 stringhe verificate e hanno prodotto output entro lo 0,2% in numero di caratteri. Non è un test di equivalenza cella per cella o di rendering. markitdown gestisce anche PDF e formati Office, quindi questo confronto riguarda solo gli output HTML misurati.

Ha bisogno di BeautifulSoup? Sì — è il suo parser, e gran parte dei 1,8 MiB. Se il tuo progetto usa già BeautifulSoup, il costo marginale di markdownify è piccolo. Se no, e il disco conta davvero, html2text pesa 0,2 MiB con un solo pacchetto, al prezzo di una licenza GPL-3.0-or-later.

Come gestisce le celle vuote delle tabelle? Le conserva. Nel fixture con buchi nei dati, l’output mantiene la cella vuota nella posizione corretta, così ogni valore successivo resta nella colonna giusta. Un convertitore che salta le celle vuote produce una tabella che sembra ancora valida ma sposta tutto di una colonna a sinistra, che è il fallimento peggiore perché non segnala nulla.

Devo usare la funzione o la classe? La funzione markdownify() per il caso d’uso comune. MarkdownConverter quando devi sovrascrivere il modo in cui un elemento specifico viene convertito — tutto ciò che è stato misurato qui ha usato la funzione semplice con le opzioni predefinite.

Cosa non è stato testato qui? Quattro fixture condivisi più un diagnostico solo tabellare non costituiscono un corpus rappresentativo. La suite separata sui documenti malformati copriva 12 tipi di rottura e due controlli, ma non ogni forma possibile di HTML rotto. Liste annidate, liste di definizione, note a piè di pagina, matematica, round trip Markdown-to-HTML, equivalenza delle tabelle a livello di cella e varianti di configurazione non sono stati confrontati. Anche la velocità di conversione non è stata confrontata.

Ke
Ke
CTO di Thunderbit | Senior Data Scientist ed esperto di ML Con quasi un decennio di esperienza nel machine learning e nella data science, Ke Shen è un ex studente della Columbia University ed ex Senior Data Scientist presso Walmart Labs. Grazie a una profonda competenza, riconosciuta dai suoi pari, in Python, R, Java e statistica, condivide insight collaudati sul passaggio di algoritmi AI complessi dalla teoria a un'architettura pronta per la produzione.
Indice
Thunderbit · Agente AI per dati web

Estrai dati da qualsiasi pagina in 1 clic

Scelto da oltre 250.000 utenti
piano gratuito disponibile
Dalla pagina web al foglio di calcolo
Descrivi ciò che ti serve — l'agente AI di Thunderbit lo estrae ed esporta in Excel, Google Sheets, Airtable o Notion. Puoi iniziare gratis.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week