---
name: html_to_markdown
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "html_to_markdown(html: str) -> str"
description: "Convierte HTML a markdown. Usa readabilipy para extraer contenido principal (filtra nav, ads, boilerplate), luego markdownify para convertir a markdown. Si las librerias opcionales no estan disponibles, usa un parser stdlib como fallback."
tags: [html, markdown, parse, convert, readabilipy, markdownify, content-extraction]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: ["re", "html.parser"]
params:
  - name: html
    desc: "string con contenido HTML a convertir"
output: "string con markdown equivalente al contenido HTML"
tested: true
tests:
  - "HTML con nav/footer filtra boilerplate"
  - "HTML limpio se convierte correctamente"
  - "HTML con imagenes lazy-loaded"
test_file_path: "python/functions/core/html_to_markdown_test.py"
file_path: "python/functions/core/html_to_markdown.py"
---

## Ejemplo

```python
from core.html_to_markdown import html_to_markdown

html = """
<html>
  <body>
    <nav><a href="/">Home</a></nav>
    <main>
      <h1>Titulo del articulo</h1>
      <p>Contenido <strong>relevante</strong> aqui.</p>
    </main>
    <footer>Copyright 2026</footer>
  </body>
</html>
"""

md = html_to_markdown(html)
# "# Titulo del articulo\n\nContenido **relevante** aqui."
```

## Notas

Algoritmo:
1. Preprocesar HTML: manejar contenido oculto WeChat (`js_content` con display:none),
   lazy loading images (`data-src` → `src`).
2. Extraer contenido principal con `readabilipy` (basado en Mozilla Readability).
   Si no esta disponible, usa el HTML completo.
3. Convertir a markdown con `markdownify` (headings ATX, strip script/style).
   Si no esta disponible, usa el parser stdlib de la misma funcion.

Dependencias opcionales (mejoran la calidad si estan instaladas):
- `readabilipy` — extraccion del contenido principal (filtra nav, ads, boilerplate)
- `markdownify` — conversion HTML→markdown de alta fidelidad
- `beautifulsoup4` — requerida por readabilipy

Sin las dependencias opcionales la funcion sigue siendo pura y funcional,
usando `html.parser` de stdlib como fallback.

Funcion pura. No hace I/O ni tiene efectos secundarios.
