HTML naar Markdown converteren met Python: een uitgebreid overzicht
Python voor het converteren van HTML naar nette, LLM-klare Markdown
HTML naar Markdown converteren is een fundamentele taak in moderne ontwikkelingsworkflows, vooral wanneer je webinhoud voor Large Language Models (LLMs), documentatiesystemen of statische sitegeneratoren zoals Hugo voorbereidt. Deze gids is onderdeel van onze Documentatie-tools in 2026: Markdown, LaTeX, PDF en printworkflows hub.
Hoewel HTML is ontworpen voor webbrowsers met rijke opmaak en structuur, biedt Markdown een schone, leesbare opmaak die ideaal is voor tekstverwerking, versiebeheer en AI-consumptie. Als je nieuw bent met Markdown-syntaxis, raadpleeg dan onze Markdown Cheat Sheet voor een uitgebreid overzicht.

In dit uitgebreide overzicht bespreken we zes Pythonbibliotheken voor HTML-naar-Markdown-conversie, met praktische codevoorbeelden, prestatiebenchmarks en reële toepassingen. Of je nu een LLM-trainingspijplijn bouwt, een blog migreert naar Hugo of documentatie scrapes, je vindt hier het juiste hulpmiddel voor je workflow.
Alternatieve aanpak: Als je intelligente inhoudsextractie met semantisch begrip nodig hebt, overweeg dan ook HTML naar Markdown converteren met LLM en Ollama, wat AI-gestuurde conversie biedt voor complexe lay-outs.
Wat je leert:
- Gedetailleerde vergelijking van 6 bibliotheken met voordelen/nadelen per bibliotheek
- Prestatiebenchmarks met reële HTML-voorbeelden
- Productie-klare codevoorbeelden voor veelvoorkomende toepassingen
- Beste praktijken voor LLM-preprocessing-workflows
- Specifieke aanbevelingen op basis van je eisen
Waarom Markdown voor LLM-preprocessing?
Voor we in de tools duiken, laten we begrijpen waarom Markdown in het bijzonder waardevol is voor LLM-workflows:
- Token-efficiëntie: Markdown gebruikt aanzienlijk minder tokens dan HTML voor dezelfde inhoud
- Semantische duidelijkheid: Markdown behoudt de documentstructuur zonder vervelende tags
- Leesbaarheid: Zowel mensen als LLMs kunnen de Markdown-syntaxis gemakkelijk parsen
- Consistentie: Standaardformaat verminderd onduidelijkheid in modelinputs
- Opslag: Kleinere bestandsgroottes voor trainingdata en contextvensters
De verscheidenheid van Markdown gaat verder dan HTML-conversie – je kunt ook Worddocumenten converteren naar Markdown voor documentatieworkflows gebruiken, of het gebruiken in kennisbeheersysteem zoals Obsidian voor persoonlijk kennisbeheer. Voor meer informatie over documentconversie en opmaak over Markdown, LaTeX en PDF, zie de Documentatie-tools hub.
TL;DR - Snel vergelijkingsmatrix
Als je haast hebt, hier is een overzicht van alle zes de bibliotheken. Deze tabel helpt je snel identificeren welk hulpmiddel overeenkomt met jouw specifieke eisen:
| Kenmerk | html2text | markdownify | html-to-markdown | trafilatura | domscribe | html2md |
|---|---|---|---|---|---|---|
| HTML5-ondersteuning | Gedeeltelijk | Gedeeltelijk | Volledig | Volledig | Volledig | Volledig |
| Typehints | Nee | Nee | Ja | Gedeeltelijk | Nee | Gedeeltelijk |
| Aangepaste handlers | Beperkt | Uitstekend | Goed | Beperkt | Goed | Beperkt |
| Tabelondersteuning | Basis | Basis | Geavanceerd | Goed | Goed | Goed |
| Asynchrone ondersteuning | Nee | Nee | Nee | Nee | Nee | Ja |
| Inhoudsextractie | Nee | Nee | Nee | Uitstekend | Nee | Goed |
| Metadataverzameling | Nee | Nee | Ja | Uitstekend | Nee | Ja |
| CLI-tool | Nee | Nee | Ja | Ja | Nee | Ja |
| Snelheid | Gemiddeld | Langzaam | Snel | Zeer snel | Gemiddeld | Zeer snel |
| Actieve ontwikkeling | Nee | Ja | Ja | Ja | Beperkt | Ja |
| Pythonversie | 3.6+ | 3.7+ | 3.9+ | 3.6+ | 3.8+ | 3.10+ |
| Afhankelijkheden | Geen | BS4 | lxml | lxml | BS4 | aiohttp |
Snelle keuzegids:
- Nood aan snelheid? → trafilatura of html2md
- Nood aan aangepaste oplossingen? → markdownify
- Nood aan typesicherheid? → html-to-markdown
- Nood aan eenvoud? → html2text
- Nood aan inhoudsextractie? → trafilatura
De kandidaten: 6 Pythonbibliotheken vergeleken
Laten we in detail in elk van de bibliotheken duiken met praktische codevoorbeelden, configuratieopties en reële inzichten. Elke sectie bevat installatieinstructies, gebruiksmogelijkheden en eerlijke beoordelingen van sterktes en beperkingen.
1. html2text - De klassieke keuze
Oorspronkelijk ontwikkeld door Aaron Swartz, html2text is een standaard in de Python-ecosysteem voor meer dan tien jaar. Het richt zich op het produceren van schone, leesbare Markdown-uitvoer.
Installatie:
pip install html2text
Basisgebruik:
import html2text
# Maak converterinstantie
h = html2text.HTML2Text()
# Configureer opties
h.ignore_links = False
h.ignore_images = False
h.ignore_emphasis = False
h.body_width = 0 # Geen lijnen omsluiten
html_content = """
<h1>Welkom bij web scraping</h1>
<p>Dit is een <strong>uitgebreide gids</strong> voor het extraheren van inhoud.</p>
<ul>
<li>Eenvoudig te gebruiken</li>
<li>Bewezen in de praktijk</li>
<li Breed aangenomen</li>
</ul>
<a href="https://example.com">Meer informatie</a>
"""
markdown = h.handle(html_content)
print(markdown)
Uitvoer:
# Welkom bij web scraping
Dit is een **uitgebreide gids** voor het extraheren van inhoud.
* Eenvoudig te gebruiken
* Bewezen in de praktijk
* Breed aangenomen
[Meer informatie](https://example.com)
Geavanceerde configuratie:
import html2text
h = html2text.HTML2Text()
# Overslaan van specifieke elementen
h.ignore_links = True
h.ignore_images = True
# Beheer opmaak
h.body_width = 80 # Omsluiten bij 80 tekens
h.unicode_snob = True # Gebruik Unicode-tekens
h.emphasis_mark = '*' # Gebruik * voor nadruk in plaats van _
h.strong_mark = '**'
# Beheer tabellen
h.ignore_tables = False
# Bescherm vooraf opgemaakte tekst
h.protect_links = True
Voordelen:
- Volwassen en stabiel (meer dan 15 jaar ontwikkeling)
- Uitgebreide configuratieopties
- Goed met randgevallen
- Geen externe afhankelijkheden
Nadelen:
- Beperkte HTML5-ondersteuning
- Kan onconsistent spaties produceren
- Niet actief onderhouden (laatste grote update in 2020)
- Alleen single-threaded verwerking
Beste voor: Eenvoudige HTML-documenten, legacy-systemen, wanneer stabiliteit van vitaal belang is
2. markdownify - De flexibele optie
markdownify maakt gebruik van BeautifulSoup4 om flexibele HTML-parsing te bieden met aangepaste tagbehandeling.
Installatie:
pip install markdownify
Basisgebruik:
from markdownify import markdownify as md
html = """
<article>
<h2>Moderne webontwikkeling</h2>
<p>Bouwen met <code>Python</code> en <em>moderne frameworks</em>.</p>
<blockquote>
<p>Eenvoud is de uiteindelijke sofisticatie.</p>
</blockquote>
</article>
"""
markdown = md(html)
print(markdown)
Uitvoer:
## Moderne webontwikkeling
Bouwen met `Python` en *moderne frameworks*.
> Eenvoud is de uiteindelijke sofisticatie.
Geavanceerd gebruik met aangepaste handlers:
from markdownify import MarkdownConverter
class CustomConverter(MarkdownConverter):
"""
Maak een aangepaste converter met specifieke tagbehandeling
"""
def convert_img(self, el, text, convert_as_inline):
"""Aangepaste beeldhandler met alternatieve tekst"""
alt = el.get('alt', '')
src = el.get('src', '')
title = el.get('title', '')
if title:
return f''
return f''
def convert_pre(self, el, text, convert_as_inline):
"""Versterkte codeblokbehandeling met taaldetectie"""
code = el.find('code')
if code:
# Haal taal op uit class-attribuut (bijv. 'language-python')
classes = code.get('class', [''])
language = classes[0].replace('language-', '') if classes else ''
return f'\n```{language}\n{code.get_text()}\n```\n'
return f'\n```\n{text}\n```\n'
# Gebruik aangepaste converter
html = '<pre><code class="language-python">def hello():\n print("world")</code></pre>'
markdown = CustomConverter().convert(html)
print(markdown)
Voor meer details over het werken met Markdown-codeblokken en syntaxismarkering, zie onze gids over Markdown-codeblokken.
Selectieve tagconversie:
from markdownify import markdownify as md
# Verwijder specifieke tags volledig
markdown = md(html, strip=['script', 'style', 'nav'])
# Converteer alleen specifieke tags
markdown = md(
html,
heading_style="ATX", # Gebruik # voor koppen
bullets="-", # Gebruik - voor lijstitems
strong_em_symbol="*", # Gebruik * voor nadruk
)
Voordelen:
- Gebaseerd op BeautifulSoup4 (robuste HTML-parsing)
- Zeer aanpasbaar via subclassing
- Actief onderhouden
- Goede documentatie
Nadelen:
- Vereist BeautifulSoup4-afhankelijkheid
- Kan trager zijn voor grote documenten
- Beperkte ingebouwde tabelondersteuning
Beste voor: Aangepaste conversielogica, projecten die al BeautifulSoup4 gebruiken
3. html-to-markdown - De moderne powerunit
html-to-markdown is een volledig getypeerde, moderne bibliotheek met uitgebreide HTML5-ondersteuning en uitgebreide configuratieopties.
Installatie:
pip install html-to-markdown
Basisgebruik:
from html_to_markdown import convert
html = """
<article>
<h1>Tech-documentatie</h1>
<table>
<thead>
<tr>
<th>Kenmerk</th>
<th>Ondersteuning</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTML5</td>
<td>✓</td>
</tr>
<tr>
<td>Tabellen</td>
<td>✓</td>
</tr>
</tbody>
</table>
</article>
"""
markdown = convert(html)
print(markdown)
Geavanceerde configuratie:
from html_to_markdown import convert, Options
# Maak aangepaste opties
opties = Options(
heading_style="ATX",
bullet_style="-",
code_language_default="python",
strip_tags=["script", "style"],
escape_special_chars=True,
table_style="pipe", # Gebruik | voor tabellen
preserve_whitespace=False,
extract_metadata=True, # Metadata extraheren
)
markdown = convert(html, opties=opties)
Command-line interface:
# Converteer enkel bestand
html-to-markdown input.html -o output.md
# Converteer met opties
html-to-markdown input.html \
--heading-style atx \
--strip-tags script,style \
--extract-metadata
# Batchconversie
find ./html_files -name "*.html" -exec html-to-markdown {} -o ./markdown_files/{}.md \;
Voordelen:
- Volledige HTML5-ondersteuning inclusief semantische elementen
- Typeveilig met uitgebreide typehints
- Versterkte tabelbehandeling (samengevoegde cellen, uitlijning)
- Metadata-extraheringsmogelijkheden
- Actieve ontwikkeling en moderne codebasis
Nadelen:
- Vereist Python 3.9+
- Grotere afhankelijkheidsvoetafdruk
- Steilere leercurve
Beste voor: Complexe HTML5-documenten, typeveilig projecten, productiesystemen
4. trafilatura - De inhoudsextractie-specialist
trafilatura is niet alleen een HTML-naar-Markdown-converter, het is ook een slimme inhoudsextractiebibliotheek die specifiek is ontworpen voor web scraping en artikel-extractie.
Installatie:
pip install trafilatura
Basisgebruik:
import trafilatura
# Download en extraheren van URL
url = "https://example.com/artikel"
downloaded = trafilatura.fetch_url(url)
markdown = trafilatura.extract(downloaded, output_format='markdown')
print(markdown)
Opmerking: Trafilatura bevat ingebouwde URL-downloading, maar voor complexere HTTP-operaties, vind je onze cURL Cheat Sheet handig wanneer je werkt met APIs of geauthenticeerde eindpunten.
Geavanceerde inhoudsextractie:
import trafilatura
from trafilatura.settings import use_config
# Maak aangepaste configuratie
config = use_config()
config.set("DEFAULT", "EXTRACTION_TIMEOUT", "30")
html = """
<html>
<head><title>Artikel Titel</title></head>
<body>
<nav>Navigatiemenu</nav>
<article>
<h1>Hoofdartikel</h1>
<p>Belangrijke inhoud hier.</p>
</article>
<aside>Reclame</aside>
<footer>Voettekst</footer>
</body>
</html>
"""
# Extraheren van alleen hoofdinhoud
markdown = trafilatura.extract(
html,
output_format='markdown',
include_comments=False,
include_tables=True,
include_images=True,
include_links=True,
config=config
)
# Extraheren met metadata
result = trafilatura.extract(
html,
output_format='markdown',
with_metadata=True
)
if result:
print(f"Titel: {result.get('title', 'N/A')}")
print(f"Auteur: {result.get('author', 'N/A')}")
print(f"Datum: {result.get('date', 'N/A')}")
print(f"\nInhoud:\n{result.get('text', '')}")
Batchverwerking:
import trafilatura
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
def process_url(url):
"""Extraheren van markdown van URL"""
downloaded = trafilatura.fetch_url(url)
if downloaded:
return trafilatura.extract(
downloaded,
output_format='markdown',
include_links=True,
include_images=True
)
return None
# Verwerk meerdere URLs parallel
urls = [
"https://example.com/artikel1",
"https://example.com/artikel2",
"https://example.com/artikel3",
]
with ThreadPoolExecutor(max_workers=5) as executor:
results = list(executor.map(process_url, urls))
for i, markdown in enumerate(results):
if markdown:
Path(f"artikel_{i}.md").write_text(markdown, encoding='utf-8')
Voordelen:
- Slimme inhoudsextractie (verwijderd boilerplate)
- Ingebouwde URL-downloading met robuuste foutafhandeling
- Metadata-extractie (titel, auteur, datum)
- Taaldetectie
- Optimaliseerd voor nieuwsartikelen en blogposts
- Snel C-gestuurde parsing
Nadelen:
- Kan te veel inhoud verwijderen voor algemene HTML
- Gericht op artikel-extractie (niet algemeen doeleindig)
- Configuratiecomplexiteit voor randgevallen
Beste voor: Web scraping, artikel-extractie, LLM-trainingdata voorbereiding
5. domscribe - De semantiekbehoudende keuze
domscribe richt zich op het behouden van de semantische betekenis van HTML terwijl het wordt omgezet naar Markdown.
Installatie:
pip install domscribe
Basisgebruik:
from domscribe import html_to_markdown
html = """
<article>
<header>
<h1>Verstaan van semantische HTML</h1>
<time datetime="2024-10-24">Oktober 24, 2024</time>
</header>
<section>
<h2>Inleiding</h2>
<p>Semantische HTML geeft <mark>betekenis</mark> aan inhoud.</p>
</section>
<aside>
<h3>Gerelateerde onderwerpen</h3>
<ul>
<li>Toegankelijkheid</li>
<li>SEO</li>
</ul>
</aside>
</article>
"""
markdown = html_to_markdown(html)
print(markdown)
Aangepaste opties:
from domscribe import html_to_markdown, MarkdownOptions
opties = MarkdownOptions(
preserve_semantic_structure=True,
include_aria_labels=True,
strip_empty_elements=True
)
markdown = html_to_markdown(html, opties=opties)
Voordelen:
- Behoudt semantische HTML5-structuur
- Goed met moderne webcomponenten
- Schoon API-design
Nadelen:
- Nog in vroege ontwikkeling (API kan veranderen)
- Beperkte documentatie vergeleken met rijpere alternatieven
- Kleiner community en minder voorbeelden beschikbaar
Beste voor: Semantische HTML5-documenten, toegankelijkheidsgerichte projecten, wanneer het behouden van HTML5-semantische structuur cruciaal is
Opmerking: Hoewel domscribe nieuw is en minder getest is dan alternatieven, vult het een specifieke niche voor semantische HTML-behoud die andere tools niet prioriteren.
6. html2md - De asynchrone powerunit
html2md is ontworpen voor hoge-prestatiebatchconversies met asynchrone verwerking.
Installatie:
pip install html2md
Command-line gebruik:
# Converteer hele map
m1f-html2md convert ./website -o ./docs
# Met aangepaste instellingen
m1f-html2md convert ./website -o ./docs \
--remove-tags nav,footer \
--heading-offset 1 \
--detect-language
# Converteer enkel bestand
m1f-html2md convert index.html -o readme.md
Programmatisch gebruik:
import asyncio
from html2md import convert_html
async def convert_files():
"""Asynchrone batchconversie"""
html_files = [
'page1.html',
'page2.html',
'page3.html'
]
tasks = [convert_html(file) for file in html_files]
results = await asyncio.gather(*tasks)
return results
# Voer conversie uit
results = asyncio.run(convert_files())
Voordelen:
- Asynchrone verwerking voor hoge prestaties
- Slimme inhoudsselectie detectie
- YAML-frontmatter generatie (ideaal voor Hugo!)
- Code-taal detectie
- Parallelle verwerkingsondersteuning
Nadelen:
- Vereist Python 3.10+
- CLI-gericht (minder flexibele API)
- Documentatie kan uitgebreider zijn
Beste voor: Grote schaal migraties, batchconversies, Hugo/Jekyll migraties
Prestatiebenchmarks
Prestaties zijn belangrijk, vooral wanneer je duizenden documenten verwerkt voor LLM-training of grote schaal migraties. Het begrijpen van de relatieve snelheidsverschillen tussen bibliotheken helpt je om weloverwogen beslissingen te nemen voor je workflow.
Vergelijkende prestatieanalyse:
Op basis van typische gebruiksmogelijkheden, hier is hoe deze bibliotheken zich vergelijken over drie realistische scenario’s:
- Eenvoudige HTML: Basisblogbericht met tekst, koppen en links (5KB)
- Complexe HTML: Technische documentatie met geneste tabellen en codeblokken (50KB)
- Echte website: Volledige webpagina inclusief navigatie, voettekst, zijbalk en advertenties (200KB)
Hier is voorbeeldbenchmarkcode die je kunt gebruiken om deze bibliotheken zelf te testen:
import time
import html2text
from markdownify import markdownify
from html_to_markdown import convert
import trafilatura
def benchmark(html_content, iterations=100):
"""Benchmark conversiesnelheid"""
# html2text
start = time.time()
h = html2text.HTML2Text()
for _ in range(iterations):
_ = h.handle(html_content)
html2text_time = time.time() - start
# markdownify
start = time.time()
for _ in range(iterations):
_ = markdownify(html_content)
markdownify_time = time.time() - start
# html-to-markdown
start = time.time()
for _ in range(iterations):
_ = convert(html_content)
html_to_markdown_time = time.time() - start
# trafilatura
start = time.time()
for _ in range(iterations):
_ = trafilatura.extract(html_content, output_format='markdown')
trafilatura_time = time.time() - start
return {
'html2text': html2线时间,
'markdownify': markdownify_time,
'html-to-markdown': html_to_markdown_time,
'trafilatura': trafilatura_time
}
Typische prestatiekarakteristieken (representatieve relatieve snelheden):
| Pakket | Eenvoudig (5KB) | Complexe (50KB) | Echte site (200KB) |
|---|---|---|---|
| html2text | Gemiddeld | Langzaam | Langzaam |
| markdownify | Langzaam | Langzaam | Het langst |
| html-to-markdown | Snel | Snel | Snel |
| trafilatura | Snel | Zeer snel | Zeer snel |
| html2md (asynchrone) | Zeer snel | Zeer snel | Snelst |
Belangrijke observaties:
html2mdentrafilaturazijn het snelst voor complexe documenten, waardoor ze ideaal zijn voor batchverwerkinghtml-to-markdownbiedt de beste balans van snelheid en functies voor productiegebruikmarkdownifyis trager maar het meest flexibel – de trade-off is waard wanneer je aangepaste handlers nodig hebthtml2texttoont zijn leeftijd met langzamere prestaties, maar blijft stabiel voor eenvoudige gebruiksmogelijkheden
Opmerking: Prestatiesverschillen worden aanzienlijk wanneer je honderden of duizenden bestanden verwerkt. Voor geïsolateerde conversies werkt elk pakket goed. Focus je op functies en aanpasbaarheid in plaats daarvan.
Reële toepassingen
Theorie is handig, maar praktische voorbeelden tonen hoe deze tools werken in productie. Hier zijn vier veelvoorkomende scenario’s met volledige, productie-klare code die je kunt aanpassen voor je eigen projecten.
Toepassing 1: LLM-trainingdata voorbereiding
Vereiste: Reinige tekst extraheren van duizenden documentatiepagina’s
Aanbevolen: trafilatura + parallelle verwerking
import trafilatura
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor
def process_html_file(html_path):
"""Converteer HTML-bestand naar markdown"""
html = Path(html_path).read_text(encoding='utf-8')
markdown = trafilatura.extract(
html,
output_format='markdown',
include_links=False, # Verwijderen voor schoner trainingdata
include_images=False,
include_comments=False
)
if markdown:
output_path = html_path.replace('.html', '.md')
Path(output_path).write_text(markdown, encoding='utf-8')
return len(markdown)
return 0
# Verwerk 10.000 bestanden parallel
html_files = list(Path('./docs').rglob('*.html'))
with ProcessPoolExecutor(max_workers=8) as executor:
token_counts = list(executor.map(process_html_file, html_files))
print(f"Verwerkt {len(html_files)} bestanden")
print(f"Totaal aantal tekens: {sum(token_counts):,}")
Toepassing 2: Hugo-blog migratie
Vereiste: Migreren van WordPress-blog naar Hugo met frontmatter
Aanbevolen: html2md CLI
Hugo is een populaire statische sitegenerator die Markdown gebruikt voor inhoud. Voor meer Hugo-specifieke tips, raadpleeg onze Hugo Cheat Sheet en leer over Structuurdata markup toevoegen aan Hugo-website voor betere SEO. Onze Documentatie-tools hub heeft meer gidsen over Markdown-workflows en documentconversie.
# Converteer alle berichten met frontmatter
m1f-html2md convert ./wordpress-export \
-o ./hugo/content/posts \
--generate-frontmatter \
--heading-offset 0 \
--remove-tags script,style,nav,footer
Of programmatisch:
from html_to_markdown import convert, Options
from pathlib import Path
import yaml
def migrate_post(html_file):
"""Converteer WordPress HTML naar Hugo markdown"""
html = Path(html_file).read_text()
# Extraheren van titel en datum uit HTML
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
title = soup.find('h1').get_text() if soup.find('h1') else 'Ongetiteld'
# Converteer naar markdown
opties = Options(strip_tags=['script', 'style', 'nav', 'footer'])
markdown = convert(html, opties=opties)
# Voeg Hugo frontmatter toe
frontmatter = {
'title': title,
'date': '2024-10-24',
'draft': False,
'tags': []
}
output = f"---\n{yaml.dump(frontmatter)}---\n\n{markdown}"
# Opslaan
output_file = html_file.replace('.html', '.md')
Path(output_file).write_text(output, encoding='utf-8')
# Verwerk alle berichten
for html_file in Path('./wordpress-export').glob('*.html'):
migrate_post(html_file)
Toepassing 3: Documentatie-scraper met aangepaste opmaak
Vereiste: Scrapen van technische documentatie met aangepaste codeblokbehandeling
Aanbevolen: markdownify met aangepaste converter
Deze aanpak is vooral handig bij het migreren van documentatie van wiki-systemen. Als je documentatie beheert, zou je ook geïnteresseerd kunnen zijn in DokuWiki - zelfgehost wiki en alternatieven voor zelfgehoste documentatieoplossingen.
from markdownify import MarkdownConverter
import requests
class DocsConverter(MarkdownConverter):
"""Aangepaste converter voor technische documentatie"""
def convert_pre(self, el, text, convert_as_inline):
"""Versterkte codeblok met syntaxismarkering"""
code = el.find('code')
if code:
# Haal taal op uit class
classes = code.get('class', [])
language = next(
(c.replace('language-', '') for c in classes if c.startswith('language-')),
'text'
)
return f'\n```{language}\n{code.get_text()}\n```\n'
return super().convert_pre(el, text, convert_as_inline)
def convert_div(self, el, text, convert_as_inline):
"""Beheer speciale documentatieblokken"""
classes = el.get('class', [])
# Waarschuwingsblokken
if 'warning' in classes:
return f'\n> ⚠️ **Waarschuwing**: {text}\n'
# Info-blokken
if 'info' in classes or 'note' in classes:
return f'\n> 💡 **Opmerking**: {text}\n'
return text
def scrape_docs(url):
"""Scrapen en converteren van documentatiepagina"""
response = requests.get(url)
markdown = DocsConverter().convert(response.text)
return markdown
# Gebruik
docs_url = "https://docs.example.com/api-reference"
markdown = scrape_docs(docs_url)
Path('api-reference.md').write_text(markdown)
Toepassing 4: Nieuwsbrief naar Markdown-archief
Vereiste: Converteer HTML-e-mailnieuwsbrieven naar leesbare markdown
Aanbevolen: html2text met specifieke configuratie
import html2text
import email
from pathlib import Path
def convert_newsletter(email_file):
"""Converteer HTML-e-mail naar markdown"""
# Parse e-mail
with open(email_file, 'r') as f:
msg = email.message_from_file(f)
# Haal HTML-deel op
html_content = None
for part in msg.walk():
if part.get_content_type() == 'text/html':
html_content = part.get_payload(decode=True).decode('utf-8')
break
if not html_content:
return None
# Configureer converter
h = html2text.HTML2Text()
h.ignore_images = False
h.images_to_alt = True
h.body_width = 0
h.protect_links = True
h.unicode_snob = True
# Converteer
markdown = h.handle(html_content)
# Voeg metadata toe
subject = msg.get('Subject', 'Geen onderwerp')
date = msg.get('Date', '')
output = f"# {subject}\n\n*Datum: {date}*\n\n---\n\n{markdown}"
return output
# Verwerk nieuwsbriefarchief
for email_file in Path('./nieuwsbrieven').glob('*.eml'):
markdown = convert_newsletter(email_file)
if markdown:
output_file = email_file.with_suffix('.md')
output_file.write_text(markdown, encoding='utf-8')
Aanbevelingen per scenario
Nog steeds onzeker welk pakket je moet kiezen? Hier is een gids gebaseerd op specifieke gebruiksmogelijkheden.
Voor web scraping en LLM-preprocessing
Winnaar: trafilatura
Trafilatura excelleert in het extraheren van schone inhoud terwijl boilerplate wordt verwijderd. Ideaal voor:
- Bouwen van LLM-training datasets
- Inhoudsaggregatie
- Onderzoekspapiercollectie
- Nieuwsartikel-extractie
Voor Hugo/Jekyll migraties
Winnaar: html2md
Asynchrone verwerking en frontmattergeneratie maken bulkmigraties snel en eenvoudig:
- Batchconversie
- Automatische metadataextrahering
- YAML-frontmattergeneratie
- Kopniveauaanpassing
Voor aangepaste conversielogica
Winnaar: markdownify
Subclass de converter voor volledige controle:
- Aangepaste taghandlers
- Domein-specifieke conversies
- Specifieke opmaakvereisten
- Integratie met bestaande BeautifulSoup-code
Voor typeveilig productiesystemen
Winnaar: html-to-markdown
Moderne, typeveilig en functievolledig:
- Volledige HTML5-ondersteuning
- Uitgebreide typehints
- Geavanceerde tabelbehandeling
- Actief onderhoud
Voor eenvoudige, stabiele conversies
Winnaar: html2text
Wanneer je iets nodig hebt dat “gewoon werkt”:
- Geen afhankelijkheden
- Bewezen in de praktijk
- Uitgebreide configuratie
- Breed platformondersteuning
Beste praktijken voor LLM voorverwerking
Ongeacht welke bibliotheek je kiest, het volgen van deze beste praktijken zorgt ervoor dat de uitvoer in Markdown van hoge kwaliteit is en geoptimaliseerd is voor LLM-verwerking. Deze patronen zijn essentieel geweest in productie workflows die miljoenen documenten verwerken.
1. Reinig voor het converteren
Verwijder altijd ongewenste elementen voor het converteren om een schoner resultaat en betere prestaties te verkrijgen:
from bs4 import BeautifulSoup
import trafilatura
def clean_and_convert(html):
"""Verwijder ongewenste elementen voor het converteren"""
soup = BeautifulSoup(html, 'html.parser')
# Verwijder ongewenste elementen
for element in soup(['script', 'style', 'nav', 'footer', 'header', 'aside']):
element.decompose()
# Verwijder advertenties en tracking
for element in soup.find_all(class_=['ad', 'advertisement', 'tracking']):
element.decompose()
# Converteer de gereinigde HTML
markdown = trafilatura.extract(
str(soup),
output_format='markdown'
)
return markdown
2. Witruimte normaliseren
Verschillende converters behandelen witruimte op verschillende manieren. Normaliseer de uitvoer om consistentie over je corpus te garanderen:
import re
def normalize_markdown(markdown):
"""Reinig de markdown-ruimte"""
# Verwijder meerdere lege regels
markdown = re.sub(r'\n{3,}', '\n\n', markdown)
# Verwijder achterliggende witruimte
markdown = '\n'.join(line.rstrip() for line in markdown.split('\n'))
# Zorg voor één nieuwe regel aan het einde
markdown = markdown.rstrip() + '\n'
return markdown
3. Uitvoer valideren
Kwaliteitscontrole is essentieel. Implementeer validatie om fouten tijdig te detecteren:
def validate_markdown(markdown):
"""Valideer de kwaliteit van de markdown"""
issues = []
# Controleer op resterende HTML
if '<' in markdown and '>' in markdown:
issues.append("HTML-tags gedetecteerd")
# Controleer op gebroken links
if '[' in markdown and ']()' in markdown:
issues.append("Lege link gedetecteerd")
# Controleer op te veel codeblokken
code_block_count = markdown.count('```')
if code_block_count % 2 != 0:
issues.append("Niet gesloten codeblok")
return len(issues) == 0, issues
4. Batchverwerkingsmal
Bij het verwerken van grote documentcollecties, gebruik dan deze productie-geoorloofde mal met juiste foutafhandeling, logboekregistratie en parallellisatie:
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor
import trafilatura
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def process_file(html_path):
"""Verwerk een enkel HTML-bestand"""
try:
html = Path(html_path).read_text(encoding='utf-8')
markdown = trafilatura.extract(
html,
output_format='markdown',
include_links=True,
include_images=False
)
if markdown:
# Normaliseer
markdown = normalize_markdown(markdown)
# Valideer
is_valid, issues = validate_markdown(markdown)
if not is_valid:
logger.warning(f"{html_path}: {', '.join(issues)}")
# Sla op
output_path = Path(str(html_path).replace('.html', '.md'))
output_path.write_text(markdown, encoding='utf-8')
return True
return False
except Exception as e:
logger.error(f"Fout bij het verwerken van {html_path}: {e}")
return False
def batch_convert(input_dir, max_workers=4):
"""Converteer alle HTML-bestanden in een map"""
html_files = list(Path(input_dir).rglob('*.html'))
logger.info(f"Gevonden {len(html_files)} HTML-bestanden")
with ProcessPoolExecutor(max_workers=max_workers) as executor:
results = list(executor.map(process_file, html_files))
success_count = sum(results)
logger.info(f"Met succes geconverteerd {success_count}/{len(html_files)} bestanden")
# Gebruik
batch_convert('./html_docs', max_workers=8)
Conclusie
Het Python-ecosysteem biedt rijpe, productie-geoorloofde tools voor het converteren van HTML naar Markdown, elk geoptimaliseerd voor verschillende scenario’s. Je keuze moet overeenkomen met je specifieke vereisten:
- Snel converteren: Gebruik
html2textvanwege zijn eenvoud en nul afhankelijkheden - Aangepaste logica: Gebruik
markdownifyvoor maximale flexibiliteit via subclassing - Web scraping: Gebruik
trafilaturavoor slimme inhoudsextractie met boilerplate-removal - Bulk migraties: Gebruik
html2mdvoor asynchrone prestaties op grote schaal - Productiesystemen: Gebruik
html-to-markdownvoor typeveiligheid en uitgebreide HTML5-ondersteuning - Semantische behoud: Gebruik
domscribevoor het behouden van de HTML5-semantische structuur
Aanbevelingen voor LLM-workflows
Voor LLM-voorverwerkingsworkflows wordt een tweelagenbenadering aanbevolen:
- Start met
trafilaturavoor de initiële inhoudsextractie—het verwijdert slim navigatie, advertenties en boilerplate terwijl het de hoofdinhoud behoudt - Valt terug op
html-to-markdownvoor complexe documenten die nauwkeurig structuurbehoud vereisen, zoals technische documentatie met tabellen en codeblokken
Deze combinatie behandelt 95% van de echte wereldscenario’s effectief.
Volgende stappen
Voor meer gidsen over Markdown, LaTeX, PDF-verwerking en documentafdrukken, zie Documentatie-tools in 2026: Markdown, LaTeX, PDF & Afdrukken Workflows.
Alle deze tools (uitgezonderd html2text) worden actief onderhouden en zijn productie-geoorloofd. Het is beter om:
- 2-3 bibliotheeken te installeren die overeenkomen met je gebruiksscenario
- Ze te testen met je eigen HTML-voorbeelden
- Prestaties te benchmarken met je typische documentgroottes
- Kiezen op basis van uitvoer kwaliteit, niet alleen snelheid
Het Python-ecosysteem voor HTML naar Markdown-conversie is aanzienlijk verder ontwikkeld, en je kunt geen fout maken met welke van deze keuzes ook voor hun bedoelde gebruiksscenario’s.
Aanvullende bronnen
- html2text Documentatie
- markdownify op PyPI
- html-to-markdown op GitHub
- trafilatura Documentatie
- html2md Documentatie
- domscribe op PyPI
Opmerking: Deze vergelijking is gebaseerd op analyse van officiële documentatie, community feedback en bibliotheekarchitectuur. Prestatiekenmerken zijn representatief voor typische gebruiksmogelijkheden. Voor specifieke gebruiksscenario’s, voer je eigen benchmarks uit met je eigen HTML-voorbeelden.
Andere nuttige artikelen
- Documentatie-tools in 2026: Markdown, LaTeX, PDF & Afdrukken Workflows
- Markdown Cheat Sheet
- Markdown Codeblokken gebruiken
- Worddocumenten converteren naar Markdown: Een volledige gids
- HTML-inhoud converteren naar Markdown met behulp van LLM en Ollama
- cURL Cheat Sheet
- Hugo statische sitegenerator Cheat Sheet
- Dokuwiki - zelfgehost wiki en alternatieven
- Obsidian gebruiken voor persoonlijk kennisbeheer