markdownify igualou a contagem de linhas de tabelas emitidas do markitdown, em 1,8 MiB

Última atualização em August 17, 2026
markdownify igualou a contagem de linhas de tabelas emitidas do markitdown, em 1,8 MiB
Resumo com IA
Nos quatro arquivos HTML compartilhados com o markitdown, o markdownify produziu a mesma quantidade de linhas de tabelas Markdown emitidas pela nossa métrica — 36 contra 36 — e recuperou todas as 16 strings de conteúdo verificadas. Sua saída de 21.062 tokens foi, em tese, a menor, embora os três primeiros conversores tenham ficado dentro de 1,3%. Ele ocupa 1,8 MiB, tem licença MIT e, no momento do registro, contava com 2.235 estrelas no GitHub. É a biblioteca menos comentada desta categoria e, com base nesses números, a que eu escolheria. Comece pelo markdownify em uma carga de trabalho Python parecida com estas amostras.

Nos quatro arquivos HTML compartilhados com o markitdown, o markdownify produziu a mesma quantidade de linhas de tabelas Markdown emitidas pela nossa métrica — 36 contra 36 — e recuperou todas as 16 strings de conteúdo verificadas. Sua saída de 21.062 tokens foi, em tese, a menor, embora os três primeiros conversores tenham ficado dentro de 1,3%. Ele ocupa 1,8 MiB, tem licença MIT e, no momento do registro, contava com 2.235 estrelas no GitHub.

É a biblioteca menos comentada desta categoria e, com base nesses números, a que eu escolheria.

O que é o markdownify

markdownify é um conversor de HTML para Markdown em Python, construído sobre o BeautifulSoup. Essa é toda a arquitetura: analisa com BeautifulSoup, percorre a árvore e gera Markdown. Versão testada: 1.2.3, MIT, 2.235 estrelas, 42 issues abertas, último lançamento em 2026-06-30 — manutenção ativa, 44 releases.

Referência oficial: repositório oficial do python-markdownify.

System diagram: HTML to Markdown Path

A API é uma única função:

from markdownify import markdownify
md = markdownify(html)

Há também uma classe (MarkdownConverter) caso você queira sobrescrever o tratamento de elementos, além de um bom conjunto de opções — estilo de títulos, caracteres de lista, detecção de linguagem em blocos de código e remoção de elementos. Mas, no uso mais comum, a chamada em uma linha resolve e funciona.

pip install markdownify instala 5 pacotes e 1,8 MiB, e faz cold import em 0,046 s — o mais rápido entre os três conversores testados. A árvore de dependências é o BeautifulSoup e seus acompanhantes habituais, que muitos projetos Python já utilizam, então o custo incremental muitas vezes é praticamente zero.

A medição

Executei o teste nos quatro arquivos HTML que outro conjunto desta base já havia usado para o markitdown, com as strings de verificação previamente registradas desse conjunto — 16 strings exatas do corpo verificadas para sobrevivência, além de checagens de boilerplate para elementos da página. Um quinto arquivo, Nothing but tables, é um diagnóstico separado focado em tabelas e foi excluído do agregado das quatro amostras abaixo.

ConversorProvas do corpoCaracteres de saídaTokens (o200k)Linhas de tabelas MarkdownLinks
markdownify16/1676.86821.06236599
html2text16/1676.45221.17632545
markitdown16/1676.99521.33636598
turndown16/1695.18826.2360611

fourway-scores.json. Quatro arquivos, tokens contados com o200k_base, linhas de tabela contadas pela mesma regra em todos os quatro — incluindo uma recontagem da saída armazenada do markitdown, que bateu exatamente com o valor publicado.

Três pontos se destacam.

Ele empata com o markitdown na contagem de linhas de tabelas emitidas. 36 linhas em cada um dos quatro arquivos compartilhados, contadas pela mesma heurística. Isso não prova equivalência célula por célula; significa apenas que as duas saídas expuseram o mesmo número de linhas de tabela Markdown reconhecíveis para essa métrica.

Ele tem a menor contagem de tokens. 21.062, ligeiramente abaixo dos 21.176 do html2text e dos 21.336 do markitdown, e 19,7% abaixo dos 26.236 do turndown. Os três primeiros ficam dentro de 1,3% entre si, o que eu chamaria mais de empate do que de vitória; a diferença que realmente importa é em relação ao turndown.

Todas as verificações de conteúdo passaram. As 16. E os outros três também passaram — a sobrevivência do conteúdo não é o ponto de diferença entre essas bibliotecas.

A tabela que ele acerta

O arquivo de estatísticas de hóquei é onde os conversores se separam. markdownify:

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

GFM padrão com pipes no início e no fim, uma linha separadora e — observe a célula vazia entre 24 e 0.55ele emite a célula vazia em vez de ignorá-la. Isso parece trivial, mas não é: um conversor que descarta células vazias desloca todos os valores seguintes para a coluna errada, e a saída ainda parece uma tabela válida.

System diagram: Preserve Table Meaning

turndown, no mesmo input, transforma cada valor em seu próprio parágrafo, sem qualquer estrutura de colunas. html2text produz uma tabela correta em outro estilo, sem os pipes externos.

Se o Markdown for para um modelo, os pipes e a célula vazia preservada é que permitem responder “quantos jogos o Boston perdeu” em vez de chutar.

Duas coisas que ele remove e o turndown não remove

A fidelidade das tabelas é a diferença visível. Esta é maior — e ninguém comenta.

markdownify remove conteúdo de <script> e <style>. turndown não remove. Contado pelos marcadores que aparecem apenas dentro desses elementos, a saída do markdownify nas amostras carrega zero marcadores de script e zero marcadores de style; a do turndown carrega 10 e 84. No arquivo da Wikipedia, isso faz a diferença entre 59.561 caracteres e 74.939 — e oito linhas de JavaScript inline e CSS de configuração do MediaWiki respondem por 14.644 caracteres, 95% dessa diferença (script-style-stripping.json).

Para qualquer coisa que vá alimentar um modelo, esse é o trecho mais caro desta comparação: um bloco de configuração em JavaScript consome tokens e não carrega informação útil alguma. markdownify elimina isso sem que você peça. html2text também.

Por arquivo, markdownify e html2text concordam exatamente quando a tabela é simples e divergem quando ela não é:

Arquivomarkdownifyhtml2text
Estatísticas de hóquei27 linhas27 linhas
Wikipedia9 linhas5 linhas
Nothing but tables (diagnóstico separado)62 linhas59 linhas

markdownify emite mais linhas reconhecidas nas duas comparações diagnósticas. Na Wikipedia, especificamente, ele mantém nove linhas onde o html2text mantém cinco segundo esta métrica. Isso é um bom alerta para inspecionar tabelas aninhadas e irregulares representativas antes de escolher a ferramenta, mas não prova que cada célula emitida esteja semanticamente correta.

Instalação e licença, lado a lado com as alternativas

BibliotecaPacotesDiscoCold importLicençaEstrelasÚltimo 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

Referência oficial: markdownify no PyPI.

install-and-import.json e metadata-snapshot.json. Cada biblioteca foi instalada em seu próprio ambiente vazio.

O html2text ocupa nove vezes menos espaço em disco e é GPL-3.0-or-later. Para um produto distribuído, trate isso como um ponto de verificação para quem responde pela licença; este artigo não é aconselhamento jurídico. O markdownify é MIT, que em geral é mais permissiva, mas ainda assim precisa passar pela revisão de compliance normal.

Os 1,8 MiB também são um valor um tanto teórico se o seu projeto já usa BeautifulSoup, como muitos projetos Python de scraping usam — nesse caso, o markdownify fica quase de graça.

O ritmo de lançamentos do markdownify é o mais saudável dos três: 44 releases e um push seis semanas antes do teste, contra o último release do html2text em abril de 2025.

O que uma linha de Python realmente entrega

A biblioteca inteira é markdownify(html), e vale ser explícito sobre o que essa chamada decide por você, porque três dessas decisões são justamente as que definiram esta comparação.

Ele faz o parse com BeautifulSoup, remove <script> e <style> sem que você peça e gera tabelas no estilo GFM, com pipes externos e células vazias preservadas. Só a origem do parser não garante comportamento com entrada malformada, então essa questão é avaliada separadamente abaixo.

Nada disso é configurado por padrão. É o comportamento padrão, e numa categoria em que o turndown preserva JavaScript por padrão e o html2text quebra linha automaticamente a cada 78 caracteres, uma biblioteca cujo comportamento pronto para uso não precisa de correção já tem valor por si só.

As opções existem quando você precisa delas — heading_style, bullets, code_language, strip e convert para listas de permissão e bloqueio de elementos, e MarkdownConverter para sobrescritas por elemento. Nada do que foi medido aqui usou qualquer uma delas.

Memória e o que o HTML quebrado faz com ela

Measured results chart: markdownify: memory and malformed input

O contexto mais amplo do stress test está na comparação entre dez bibliotecas de memória e HTML malformado.

Duas coisas que toda análise deste conjunto marcava como não testadas, agora foram medidas.

Memória residente de pico, via /usr/bin/time -l, um processo novo por célula — o piso de importação é o custo da biblioteca carregada e ociosa; os picos incluem o documento.

BibliotecaRuntimePiso de importaçãoPico 226 KBPico 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. Os baselines de Python e Node não são comparáveis entre si; o interpretador faz parte dos dois.

markdownify fica no meio: um piso de 23,9 MiB e 278,5 MiB em um documento de 10 MB. Isso é 3,9 vezes o pico do html2text e cerca de um décimo do turndown, que é o preço de usar BeautifulSoup por baixo.

HTML quebrado. Doze documentos, cada um quebrando exatamente uma coisa — tags não fechadas, elementos inline mal aninhados, atributos sem aspas com espaços, fechamentos soltos, ausência total de <html>, atributos duplicados, documento truncado no meio de uma tag, entidades inválidas, um <script> não fechado, uma declaração de charset mentirosa, um comentário contendo markup e 600 níveis de aninhamento — mais dois controles bem formados em tamanhos equivalentes, porque “ele não retornou nada” só diz algo sobre malformação se a biblioteca também não ficar em silêncio em um documento limpo do mesmo tamanho.

markdownify gerou exceção em 1 de 14 e não retornou nada em 0, recuperando 30/33 sentinelas nas amostras quebradas (malformed-results.json). Um arquivo fica fora dessa contagem: pelo HTML5, tudo depois de um <script> não fechado é conteúdo de script, então perdê-lo ali está correto, e recuperá-lo é que seria o desvio.

Prós e contras

A favor. Fidelidade de tabela igual à do markitdown, contada pela mesma regra. Menor contagem de tokens entre os quatro. MIT. 1,8 MiB, e custo marginal próximo de zero se o BeautifulSoup já estiver na sua árvore de dependências. Cold import mais rápido, em 0,046 s. Lançamentos ativos. Preserva células vazias em tabelas. Conversão por elemento sobrescrevível via MarkdownConverter. A chamada simples de uma linha é a escolha certa.

Contra. Depende do BeautifulSoup, então ocupa nove vezes mais disco que o html2text se você ainda não o tiver. 2.235 estrelas significam uma comunidade menor que a do turndown — menos exemplos práticos quando você encontra algo estranho. Só Python, então não ajuda em uma stack Node. E 42 issues abertas.

Quem deve usar e quem não deve

Comece pelo markdownify em uma carga de trabalho Python parecida com estes arquivos. Ele iguala a contagem de linhas emitidas do markitdown sob esta métrica, fica no grupo de menor número de tokens e é MIT. Se você já depende de BeautifulSoup, o footprint adicional de instalação pode ser pequeno; valide o delta real de dependências no seu ambiente.

Considere o html2text se o orçamento de dependências é medido em centenas de kilobytes e o formato de saída atende às suas páginas. Revise a GPL-3.0-or-later com quem responde pela licença antes de distribuir.

Considere o markitdown se você já converte PDFs ou documentos do Office. Os resultados de HTML tiveram a mesma contagem de linhas emitidas aqui, mas a fidelidade mais ampla não foi demonstrada como equivalente.

Ignore-o no Node, onde o turndown é a resposta natural — com turndown-plugin-gfm instalado junto, porque o núcleo do turndown não produz tabelas.

Onde uma API gerenciada entra

markdownify converte o HTML que você já tem. Ele não faz fetch, não renderiza JavaScript e não lida com camada anti-bot — nenhum dos quatro conversores faz isso, e em muitos alvos reais essa é a parte mais difícil do trabalho.

Para as mesmas amostras nos cinco conversores, veja a comparação HTML para Markdown em cinco vias.

Nossa própria stack de desenvolvedor em Thunderbit resolve essa etapa anterior: POST /distill busca uma URL e devolve Markdown, enquanto POST /extract devolve JSON em formato de schema. Ambos estão disponíveis via servidor MCP e CLI; os preços estão na página de preços da Thunderbit. Esses endpoints hospedados não foram benchmarkados contra esses conversores locais, então aqui a distinção é de categoria, não de desempenho.

A formulação honesta: se você já tem o HTML e quer Markdown, o markdownify é gratuito e faz o trabalho tão bem quanto qualquer outro aqui. Se você está buscando páginas, ou quer linhas em vez de prosa, isso já é outra compra.

Para o panorama mais amplo, nosso resumo de APIs de web scraping cobre opções hospedadas e o pilar de scrapers open source cobre as auto-hospedadas. Convertendo HTML para Markdown em Python é o passo a passo prático.

Experimente a Thunderbit para extração de dados da web

Vale a pena usar markdownify?

Para Python, ele é um forte candidato quando suas entradas se parecem com estas amostras; teste nas suas próprias tabelas e páginas malformadas antes de torná-lo o padrão.

Ele empata com o markitdown na contagem de linhas de tabela emitidas, fica no grupo de menor número de tokens, foi o mais rápido para importar neste teste e tem licença MIT. Contra isso, consumiu mais memória que o html2text, é exclusivo de Python e falhou em uma amostra de HTML malformado. Disco e licença são fatores adicionais de seleção, não os únicos argumentos.

O que mais me chama atenção é a contagem de estrelas. O turndown tem cinco vezes mais atenção e, fora da caixa, não converte nenhuma das tabelas que o markdownify lida corretamente. A popularidade nessa categoria não acompanha o comportamento medido, e essa é uma das principais razões pelas quais valeu a pena rodar esta comparação.

Experimente a Thunderbit para extração de dados da web Get Started Free

Perguntas frequentes

O markdownify é realmente tão bom quanto o markitdown em HTML? Nestes quatro arquivos, os dois emitiram 36 linhas de tabela Markdown reconhecidas cada um, recuperaram todas as 16 strings verificadas e geraram saídas com diferença de apenas 0,2% no número de caracteres. Isso não é um teste de equivalência célula a célula nem de renderização. O markitdown também lida com formatos PDF e Office, então esta comparação vale apenas para as saídas HTML medidas aqui.

Ele precisa de BeautifulSoup? Sim — esse é o parser dele e também a maior parte dos 1,8 MiB. Se o seu projeto já usa BeautifulSoup, o custo marginal do markdownify é pequeno. Se não usa, e o espaço em disco realmente importa, o html2text ocupa 0,2 MiB com um pacote, ao custo de uma licença GPL-3.0-or-later.

Como ele trata células vazias em tabelas? Ele as preserva. No arquivo com lacunas nos dados, a saída mantém a célula vazia na posição correta, então todos os valores seguintes continuam na coluna certa. Um conversor que ignora células vazias produz uma tabela que ainda parece válida e desloca cada valor uma coluna para a esquerda — uma falha pior, porque nada denuncia o erro.

Devo usar a função ou a classe? A função markdownify() para o caso comum. MarkdownConverter quando você precisa sobrescrever como um elemento específico é convertido — tudo o que foi medido aqui usou a função simples, com as opções padrão.

O que não foi testado aqui? Quatro arquivos compartilhados mais um diagnóstico só de tabelas não formam um corpus representativo. O conjunto separado de HTML malformado cobriu 12 tipos de quebra nomeados e dois controles, mas não todas as formas de HTML quebrado. Listas aninhadas, listas de definição, notas de rodapé, matemática, round trips de Markdown para HTML, equivalência de tabelas célula a célula e variações de configuração não foram comparadas. A velocidade de conversão também não foi comparada.

Ke
Ke
CTO na Thunderbit | Cientista de Dados Sênior e Especialista em ML Com quase uma década de experiência em machine learning e data science, Ke Shen é ex-aluno da Columbia University e foi Cientista de Dados Sênior na Walmart Labs. Com profunda experiência, reconhecida pelos pares, em Python, R, Java e Estatística, ele compartilha insights testados em batalha sobre como levar algoritmos complexos de IA da teoria à arquitetura pronta para produção.
Sumário
Thunderbit · Agente de dados web com IA

Extraia dados de qualquer página em 1 clique

Aprovado por mais de 250.000 usuários
plano gratuito disponível
Da página web para a planilha
Descreva o que você precisa — o Agente de IA da Thunderbit extrai e exporta para Excel, Google Sheets, Airtable ou Notion. Comece grátis.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week