markdownify igualó el recuento de filas de tabla emitidas de markitdown, con solo 1,8 MiB

Última actualización: August 17, 2026
markdownify igualó el recuento de filas de tabla emitidas de markitdown, con solo 1,8 MiB
Resumen con IA
En los cuatro conjuntos HTML compartidos con markitdown, markdownify produjo el mismo número de filas Markdown emitidas según nuestro contador — 36 frente a 36 — y recuperó las 16 cadenas de contenido verificadas. Su salida de 21.062 tokens fue, nominalmente, la más baja, aunque los tres primeros convertidores estuvieron dentro del 1,3%. Se instala con 1,8 MiB, tiene licencia MIT y, en el momento de la captura, contaba con 2.235 estrellas en GitHub. Es la biblioteca menos comentada de esta categoría y, con estos números, la que yo elegiría. Empieza con markdownify para una carga de trabajo Python parecida a estos conjuntos.

En los cuatro conjuntos HTML compartidos con markitdown, markdownify generó el mismo número de filas Markdown de tabla emitidas según nuestro contador — 36 frente a 36 — y recuperó las 16 cadenas de contenido verificadas. Su salida de 21.062 tokens fue, nominalmente, la más baja, aunque los tres primeros convertidores estuvieron dentro del 1,3%. Se instala con 1,8 MiB, tiene licencia MIT y, en el momento de la captura, contaba con 2.235 estrellas en GitHub.

Es la biblioteca menos comentada de esta categoría y, con estos números, la que yo elegiría.

Qué es markdownify

markdownify es un convertidor de HTML a Markdown para Python, construido sobre BeautifulSoup. Esa es toda la arquitectura: analiza con BeautifulSoup, recorre el árbol y genera Markdown. Versión probada: 1.2.3, licencia MIT, 2.235 estrellas, 42 incidencias abiertas, última publicación el 2026-06-30 — mantenimiento activo, 44 versiones.

Referencia oficial: repositorio oficial de python-markdownify.

System diagram: HTML to Markdown Path

La API es una sola función:

from markdownify import markdownify
md = markdownify(html)

También existe una clase (MarkdownConverter) si quieres sobrescribir el tratamiento de elementos, y un buen conjunto de opciones — estilo de encabezados, caracteres de viñeta, detección de lenguaje en bloques de código, eliminación de elementos. Pero el caso habitual es la versión de una línea, y funciona.

pip install markdownify instala 5 paquetes y ocupa 1,8 MiB, y la importación en frío tarda 0,046 s — la más rápida de los tres convertidores con los que la comparé. Su árbol de dependencias es BeautifulSoup y sus acompañantes habituales, que muchos proyectos Python ya incluyen, así que el coste marginal suele ser casi nulo.

La medición

Lo ejecuté sobre los cuatro conjuntos HTML que otro paquete de esta base ya había usado para markitdown, usando las cadenas de prueba preregistradas de ese paquete — 16 cadenas exactas del cuerpo comprobadas para ver si sobrevivían, además de verificaciones de texto auxiliar de la interfaz de la página. Un quinto conjunto, Nothing but tables, es un diagnóstico aparte centrado en tablas y queda fuera del agregado de cuatro conjuntos que aparece abajo.

ConvertidorPruebas de contenidoCaracteres de salidaTokens (o200k)Filas de tabla MarkdownEnlaces
markdownify16/1676,86821,06236599
html2text16/1676,45221,17632545
markitdown16/1676,99521,33636598
turndown16/1695,18826,2360611

fourway-scores.json. Cuatro conjuntos, tokens contados con o200k_base, filas de tabla contadas con una única regla en los cuatro casos — incluyendo un recuento de la salida almacenada de markitdown, que coincidió exactamente con su cifra publicada.

Destacan tres cosas.

Empata con markitdown en el recuento de filas de tabla emitidas. 36 filas cada uno en los cuatro conjuntos compartidos, contadas con la misma heurística. Eso no demuestra equivalencia celda por celda; solo indica que ambas salidas mostraron el mismo número de filas Markdown reconocibles para este contador.

Tiene el menor número de tokens. 21.062, ligeramente por debajo de los 21.176 de html2text y de los 21.336 de markitdown, y un 19,7% por debajo de los 26.236 de turndown. Los tres primeros están dentro del 1,3% entre sí, así que yo lo llamaría un empate más que una victoria; la diferencia que importa es frente a turndown.

Superó todas las pruebas de contenido. Las 16. Los otros tres también; la supervivencia del contenido no es donde estas bibliotecas se distinguen.

La tabla que sí conserva bien

El conjunto de estadísticas de hockey es donde los convertidores se separan. markdownify:

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

Markdown estándar de GitHub con pipes iniciales y finales, una fila separadora y — fíjate en la celda vacía entre 24 y 0.55emite la celda vacía en lugar de omitirla. Suena trivial y no lo es: un convertidor que elimina celdas vacías desplaza todos los valores posteriores a la columna equivocada, y aun así la tabla parece válida.

System diagram: Preserve Table Meaning

turndown, con la misma entrada, emite cada valor como un párrafo independiente, sin estructura de columnas. html2text genera una tabla correcta con un estilo distinto, sin los pipes exteriores.

Si ese Markdown va a un modelo, los pipes y la celda vacía conservada son lo que le permiten responder “cuántos partidos perdió Boston” en lugar de adivinar.

Dos cosas que elimina y que turndown no elimina

La fidelidad de tablas es la diferencia visible. Esta es más importante y casi nadie la menciona.

markdownify elimina el contenido de <script> y <style>. turndown no lo hace. Contando los marcadores que aparecen solo dentro de esos elementos, la salida de markdownify en los conjuntos tiene cero marcadores de script y cero de style; la de turndown tiene 10 y 84. En el conjunto de Wikipedia, eso marca la diferencia entre 59.561 caracteres y 74.939 — y ocho líneas de la configuración JavaScript y CSS en línea de MediaWiki explican 14.644 caracteres, el 95% de esa brecha (script-style-stripping.json).

Para cualquier cosa que alimente a un modelo, eso es lo más caro de toda esta comparación: un bloque de configuración JavaScript consume tokens y no aporta información alguna. markdownify lo elimina sin pedirlo. html2text también.

Por conjunto, markdownify y html2text coinciden exactamente cuando la tabla es simple y divergen cuando no lo es:

Conjuntomarkdownifyhtml2text
Estadísticas de hockey27 filas27 filas
Wikipedia9 filas5 filas
Nothing but tables (diagnóstico separado)62 filas59 filas

markdownify emite más filas reconocidas en ambas comparaciones de diagnóstico. En Wikipedia, concretamente, mantiene nueve filas donde html2text conserva cinco bajo este contador. Eso es una advertencia útil para revisar tablas anidadas e irregulares representativas antes de elegir, no una prueba de que cada celda emitida sea semánticamente correcta.

Instalación y licencia, comparadas con las alternativas

BibliotecaPaquetesDiscoImportación en fríoLicenciaEstrellasÚltima versión
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

Referencia oficial: markdownify en PyPI.

install-and-import.json y metadata-snapshot.json. Cada biblioteca se instaló en su propio entorno vacío.

html2text ocupa nueve veces menos en disco, y su licencia es GPL-3.0-or-later. Para un producto distribuido, eso es un punto de control para quien gestione la licencia; este artículo no es asesoramiento legal. markdownify usa MIT, que por lo general es más permisiva, aunque igualmente debe pasar por la revisión normal de cumplimiento.

Los 1,8 MiB también son algo teóricos si tu proyecto ya usa BeautifulSoup, como ocurre con muchísimos proyectos Python de scraping; en ese caso, markdownify cuesta prácticamente cero.

markdownify tiene el ritmo de lanzamientos más saludable de los tres: 44 versiones y un push seis semanas antes de la prueba, frente a la última versión de html2text en abril de 2025.

Qué te aporta realmente una sola línea de Python

La biblioteca entera es markdownify(html), y conviene ser explícito sobre lo que esa llamada decide por ti, porque tres de esas decisiones son justo las que esta comparación puso a prueba.

Analiza con BeautifulSoup, elimina <script> y <style> sin que se lo pidas, y emite tablas estilo GFM con pipes exteriores y celdas vacías conservadas. Que el analizador sea de buena familia no garantiza cómo se comportará con HTML mal formado, así que esa cuestión se mide aparte más abajo.

Nada de eso son opciones que tengas que configurar. Es el comportamiento por defecto, y en una categoría donde el valor predeterminado de turndown conserva JavaScript y el de html2text fuerza saltos de línea cada 78 caracteres, una biblioteca cuyo comportamiento listo para usar no necesita corrección tiene su propio valor.

Las opciones existen cuando las necesitas — heading_style, bullets, code_language, strip y convert para listas de inclusión y exclusión de elementos, y MarkdownConverter para sobrescribir el comportamiento por elemento. En todo lo medido aquí no se usó ninguna.

Memoria y qué le hace el HTML roto

Measured results chart: markdownify: memory and malformed input

El contexto más amplio de la prueba de estrés está en la comparativa de memoria y HTML mal formado entre diez bibliotecas.

Dos cosas que cada revisión de este lote dejó sin medir, ahora sí están medidas.

Memoria residente máxima, mediante /usr/bin/time -l, un proceso nuevo por celda — el suelo de importación es lo que cuesta la biblioteca cargada e inactiva; los picos incluyen el documento.

BibliotecaRuntimeSuelo de importaciónPico 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. Las líneas base de Python y Node no son comparables entre sí; el intérprete está dentro de ambas.

markdownify queda en el medio: un suelo de 23,9 MiB y 278,5 MiB sobre un documento de 10 MB. Eso es 3,9 veces el pico de html2text y aproximadamente una décima parte del de turndown, que es el precio de depender de BeautifulSoup.

HTML roto. Doce documentos, cada uno rompiendo exactamente una cosa — etiquetas sin cerrar, anidación incorrecta de elementos inline, atributos sin comillas con espacios, cierres sueltos, ausencia total de <html>, atributos duplicados, un documento truncado a mitad de etiqueta, entidades defectuosas, un <script> sin cerrar, una declaración de charset mentirosa, un comentario que contiene marcado y 600 niveles de anidación — más dos controles bien formados de tamaño equivalente, porque “no devolvió nada” solo dice algo sobre la rotura si la biblioteca tampoco guarda silencio frente a un documento limpio del mismo tamaño.

markdownify lanzó excepción en 1 de 14 y no devolvió nada en 0, recuperando 30/33 centinelas a través de los conjuntos rotos (malformed-results.json). Un conjunto queda excluido de ese conteo: según HTML5, todo lo que viene después de un <script> sin cerrar es contenido del script, así que perderlo ahí es correcto y recuperarlo sería la desviación.

Ventajas y desventajas

A su favor. Fidelidad de tablas igual a la de markitdown, medida con la misma regla. El menor número de tokens de los cuatro. MIT. 1,8 MiB, y coste marginal casi nulo si BeautifulSoup ya está en tu árbol de dependencias. Importación en frío más rápida, 0,046 s. Lanzamientos activos. Conserva celdas vacías en tablas. Conversión por elemento sobrescribible mediante MarkdownConverter. La llamada sencilla de una línea es la correcta.

En contra. Depende de BeautifulSoup, así que ocupa nueve veces más disco que html2text si aún no lo tienes. 2.235 estrellas significan una comunidad más pequeña que la de turndown — menos ejemplos trabajados cuando te encuentres con algo raro. Solo Python, así que no ayuda en un stack Node. Y 42 incidencias abiertas.

Quién debería usarlo y quién no

Empieza por markdownify para una carga de trabajo Python parecida a estos conjuntos. Empata con markitdown en el recuento de filas emitidas bajo este contador, está en el grupo de menor número de tokens y usa MIT. Si ya dependes de BeautifulSoup, su huella marginal de instalación puede ser pequeña; valida el incremento real de dependencias en tu entorno.

Considera html2text si el presupuesto de dependencias se mide en cientos de kilobytes y su forma de salida te sirve para tus páginas. Revisa la licencia GPL-3.0-or-later con quien sea responsable de licencias antes de distribuir.

Considera markitdown si ya conviertes PDF o documentos de Office. Sus resultados HTML tuvieron aquí el mismo recuento de filas emitidas, pero no se demostró una fidelidad global equivalente.

Sáltalo en Node, donde turndown es la respuesta natural — con turndown-plugin-gfm instalado junto a él, porque el núcleo de turndown no produce tablas en absoluto.

Dónde encaja una API gestionada

markdownify convierte el HTML que ya tienes. No descarga páginas, no renderiza JavaScript, no maneja capas anti-bot — ninguno de los cuatro convertidores lo hace, y en muchos objetivos reales esa es la mitad más difícil del trabajo.

Para los mismos conjuntos en los cinco convertidores, consulta la comparativa HTML a Markdown de cinco vías.

Nuestra propia pila para desarrolladores en Thunderbit resuelve ese trabajo aguas arriba: POST /distill obtiene una URL y devuelve Markdown, mientras que POST /extract devuelve JSON con estructura de esquema. Ambos están disponibles mediante un servidor MCP y una CLI; los precios están en la página de precios de Thunderbit. Esos endpoints alojados no se compararon con estos convertidores locales, así que esto es una distinción de categoría, no una comparación de rendimiento.

La forma honesta de verlo: si ya tienes el HTML y quieres Markdown, markdownify es gratis y lo hace tan bien como cualquiera aquí. Si estás obteniendo páginas, o quieres filas en vez de prosa, estás comprando otra cosa.

Para el panorama completo, nuestro resumen de APIs de web scraping cubre opciones alojadas y el pilar de scrapers open source las autogestionadas. Convertir HTML a Markdown en Python es la guía práctica.

Prueba Thunderbit para extracción de datos web

¿Deberías usar markdownify?

Para Python, es un candidato sólido cuando tus entradas se parecen a estos conjuntos; pruébalo con tus propias tablas y páginas mal formadas antes de convertirlo en el valor predeterminado.

Empata con markitdown en el recuento de filas de tabla emitidas, está en el grupo de menor tokenización, fue el más rápido al importar en esta prueba y usa MIT. En contra, usó más memoria que html2text, es solo para Python y falló en un conjunto de entrada mal formada. El disco y la licencia son factores adicionales de selección, no los únicos argumentos.

Lo que más me llama la atención es el número de estrellas. turndown tiene cinco veces más atención y, de fábrica, no convierte ninguna de las tablas que markdownify maneja correctamente. La popularidad en esta categoría no refleja el comportamiento medido, y esa es precisamente la razón por la que merecía la pena ejecutar esta comparación.

Prueba Thunderbit para extracción de datos web Get Started Free

Preguntas frecuentes

¿markdownify es realmente tan bueno como markitdown con HTML? En estos cuatro conjuntos, ambos emitieron 36 filas Markdown de tabla reconocidas, recuperaron las 16 cadenas comprobadas y generaron salidas con una diferencia de solo 0,2% en caracteres. Eso no es una prueba de equivalencia a nivel de celda ni de renderizado. markitdown además maneja formatos PDF y Office, así que esta comparación solo trata de las salidas HTML medidas.

¿Necesita BeautifulSoup? Sí: ese es su analizador y gran parte de sus 1,8 MiB. Si tu proyecto ya usa BeautifulSoup, el coste marginal de markdownify es pequeño. Si no, y el disco realmente importa, html2text ocupa 0,2 MiB y usa un solo paquete, a cambio de una licencia GPL-3.0-or-later.

¿Cómo maneja las celdas vacías de tablas? Las conserva. En el conjunto con huecos en los datos, la salida mantiene la celda vacía en su posición, de modo que cada valor posterior sigue en su columna correcta. Un convertidor que omite celdas vacías produce una tabla que sigue pareciendo válida y tiene cada valor una columna a la izquierda, que es el peor fallo porque nada lo señala.

¿Debería usar la función o la clase? La función markdownify() para el caso común. MarkdownConverter cuando necesites cambiar cómo se convierte un elemento concreto; todo lo medido aquí usó la función simple con opciones por defecto.

¿Qué no se probó aquí? Cuatro conjuntos compartidos más un diagnóstico centrado solo en tablas no son un corpus representativo. El conjunto separado de HTML mal formado cubrió 12 roturas nombradas y dos controles, pero no todas las formas de HTML roto. No se compararon listas anidadas, listas de definiciones, notas al pie, matemáticas, conversiones de Markdown a HTML y vuelta, equivalencia de tablas a nivel de celda ni variantes de configuración. Tampoco se comparó la velocidad de conversión.

Ke
Ke
CTO en Thunderbit | Científico de datos sénior y experto en ML Con casi una década de experiencia en aprendizaje automático y ciencia de datos, Ke Shen es exalumno de la Universidad de Columbia y antiguo científico de datos sénior en Walmart Labs. Con una sólida experiencia, reconocida por sus pares, en Python, R, Java y estadística, comparte conocimientos probados en el campo sobre cómo llevar algoritmos complejos de IA desde la teoría hasta una arquitectura lista para producción.
Tabla de contenidos
Thunderbit · Agente de datos web con IA

Extrae datos de cualquier página en 1 clic

Con la confianza de más de 250,000 usuarios
plan gratuito disponible
De la página web a la hoja de cálculo
Describe lo que necesitas: el agente de IA de Thunderbit lo extrae y lo exporta a Excel, Google Sheets, Airtable o Notion. Empieza gratis.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week