HTML in Markdown mit Python umwandeln: Eine umfassende Anleitung
Python zum Konvertieren von HTML in sauberen, LLM-fertigen Markdown
HTML in Markdown konvertieren ist eine grundlegende Aufgabe in modernen Entwicklungsworkflows, insbesondere wenn Webinhalte für Large Language Models (LLMs), Dokumentationssysteme oder statische Seiten-Generatoren wie Hugo vorbereitet werden. Dieser Leitfaden ist Teil unseres Dokumentations-Tools 2026: Markdown, LaTeX, PDF & Druckworkflows Hubs.
Obwohl HTML für Webbrowser mit reicher Gestaltung und Struktur entwickelt wurde, bietet Markdown eine saubere, lesbare Formatierung, die ideal für Textverarbeitung, Versionskontrolle und die Verarbeitung durch KI ist. Wenn Sie neu im Markdown-Syntax sind, schauen Sie sich unsere Markdown Cheatsheet für eine umfassende Referenz an.

In dieser umfassenden Übersicht werden wir sechs Python-Pakete für die Konvertierung von HTML in Markdown untersuchen, wobei praktische Codebeispiele, Leistungsbenchmarks und reale Anwendungsfälle bereitgestellt werden. Egal, ob Sie einen LLM-Training-Pipeline erstellen, einen Blog in Hugo migrieren oder Dokumentationen scrapen, Sie werden das perfekte Werkzeug für Ihren Workflow finden.
Alternative Vorgehensweise: Wenn Sie eine intelligentere Inhaltsextraktion mit semantischem Verständnis benötigen, können Sie auch HTML in Markdown konvertieren mit LLM und Ollama in Betracht ziehen, das eine KI-gestützte Konvertierung für komplexe Layouts bietet.
Was Sie lernen werden:
- Detaillierte Vergleich von 6 Bibliotheken mit Vor- und Nachteilen für jede
- Leistungsbenchmarks mit realen HTML-Beispielen
- Produktionsrechte Codebeispiele für gängige Anwendungsfälle
- Best Practices für LLM-Vorverarbeitungsworkflows
- Konkrete Empfehlungen basierend auf Ihren Anforderungen
Warum Markdown für LLM-Vorverarbeitung?
Bevor wir in die Tools eintauchen, verstehen wir, warum Markdown besonders wertvoll für LLM-Workflows ist:
- Token-Effizienz: Markdown verwendet erheblich weniger Tokens als HTML für denselben Inhalt
- Semantische Klarheit: Markdown bewahrt die Dokumentstruktur ohne umfangreiche Tags
- Lesbarkeit: Sowohl Menschen als auch LLMs können Markdown-Syntax leicht parsen
- Konsistenz: Standardisiertes Format reduziert Ambiguität in Modell-Eingaben
- Speicher: Kleinere Dateigrößen für Trainingsdaten und Kontextfenster
Die Vielseitigkeit von Markdown geht über die HTML-Konvertierung hinaus – Sie können auch Word-Dokumente in Markdown konvertieren für Dokumentationsworkflows verwenden oder sie in Wissensmanagementsystemen wie Obsidian für persönliche Wissensverwaltung. Für mehr zu Dokumentenkonvertierung und Formatierung über Markdown, LaTeX und PDF, siehe den Dokumentations-Tools-Hub.
TL;DR - Schnellvergleichsmatrix
Wenn Sie in Eile sind, hier ist ein umfassender Vergleich aller sechs Bibliotheken auf einen Blick. Diese Tabelle hilft Ihnen, schnell zu erkennen, welches Werkzeug Ihren spezifischen Anforderungen entspricht:
| Funktion | html2text | markdownify | html-to-markdown | trafilatura | domscribe | html2md |
|---|---|---|---|---|---|---|
| HTML5-Unterstützung | Teilweise | Teilweise | Voll | Voll | Voll | Voll |
| Typ-Hinweise | Nein | Nein | Ja | Teilweise | Nein | Teilweise |
| Benutzerdefinierte Handler | Begrenzt | Ausgezeichnet | Gut | Begrenzt | Gut | Begrenzt |
| Tabellenunterstützung | Grundlegend | Grundlegend | Erweitert | Gut | Gut | Gut |
| Asynchrone Unterstützung | Nein | Nein | Nein | Nein | Nein | Ja |
| Inhaltsextraktion | Nein | Nein | Nein | Ausgezeichnet | Nein | Gut |
| Metadatenextraktion | Nein | Nein | Ja | Ausgezeichnet | Nein | Ja |
| CLI-Tool | Nein | Nein | Ja | Ja | Nein | Ja |
| Geschwindigkeit | Mittel | Langsam | Schnell | Sehr schnell | Mittel | Sehr schnell |
| Aktive Entwicklung | Nein | Ja | Ja | Ja | Begrenzt | Ja |
| Python-Version | 3.6+ | 3.7+ | 3.9+ | 3.6+ | 3.8+ | 3.10+ |
| Abhängigkeiten | Keine | BS4 | lxml | lxml | BS4 | aiohttp |
Schnellleitfaden zur Auswahl:
- Benötigen Sie Geschwindigkeit? → trafilatura oder html2md
- Benötigen Sie Anpassungsfähigkeit? → markdownify
- Benötigen Sie Typsicherheit? → html-to-markdown
- Benötigen Sie Einfachheit? → html2text
- Benötigen Sie Inhaltsextraktion? → trafilatura
Die Konkurrenten: 6 Python-Pakete im Vergleich
Lassen Sie uns tief in jedes Library eintauchen, mit praktischen Codebeispielen, Konfigurationsoptionen und realen Einblicken. Jeder Abschnitt enthält Installationsanweisungen, Nutzungsmuster und ehrliche Bewertungen der Stärken und Schwächen.
1. html2text - Die klassische Wahl
Ursprünglich von Aaron Swartz entwickelt, ist html2text seit über einem Jahrzehnt ein Standard in der Python-Ökosystem. Es konzentriert sich darauf, saubere, lesbare Markdown-Ausgabe zu produzieren.
Installation:
pip install html2text
Grundlegende Verwendung:
import html2text
# Erstellen Sie eine Konverterinstanz
h = html2text.HTML2Text()
# Konfigurieren Sie Optionen
h.ignore_links = False
h.ignore_images = False
h.ignore_emphasis = False
h.body_width = 0 # Zeilen nicht umbruch
html_content = """
<h1>Willkommen bei Web Scraping</h1>
<p>Dies ist ein <strong>umfassender Leitfaden</strong> zur Extraktion von Inhalten.</p>
<ul>
<li>Leicht zu verwenden</li>
<li>Battle-tested</li>
<li>Sehr verbreitet</li>
</ul>
<a href="https://example.com">Mehr erfahren</a>
"""
markdown = h.handle(html_content)
print(markdown)
Ausgabe:
# Willkommen bei Web Scraping
Dies ist ein **umfassender Leitfaden** zur Extraktion von Inhalten.
* Leicht zu verwenden
* Battle-tested
* Sehr verbreitet
[Mehr erfahren](https://example.com)
Erweiterte Konfiguration:
import html2text
h = html2text.HTML2Text()
# Bestimmte Elemente überspringen
h.ignore_links = True
h.ignore_images = True
# Formatierung steuern
h.body_width = 80 # Umbruch bei 80 Zeichen
h.unicode_snob = True # Unicode-Charaktere verwenden
h.emphasis_mark = '*' # * für Betonung anstelle von _
h.strong_mark = '**'
# Tabellen behandeln
h.ignore_tables = False
# Vorformatierten Text schützen
h.protect_links = True
Vorteile:
- Reif und stabil (mehr als 15 Jahre Entwicklung)
- Umfangreiche Konfigurationsoptionen
- Behandelt Randfälle gut
- Keine externen Abhängigkeiten
Nachteile:
- Begrenzte HTML5-Unterstützung
- Kann ungleichmäßige Abstände erzeugen
- Nicht aktiv gepflegt (letzte Hauptupdate 2020)
- Nur Single-threaded Verarbeitung
Beste für: Einfache HTML-Dokumente, Legacy-Systeme, wenn Stabilität von entscheidender Bedeutung ist
2. markdownify - Die flexible Option
markdownify nutzt BeautifulSoup4, um flexibles HTML-Parsing mit anpassbaren Tag-Handling bereitzustellen.
Installation:
pip install markdownify
Grundlegende Verwendung:
from markdownify import markdownify as md
html = """
<article>
<h2>Modernes Webentwicklung</h2>
<p>Erstellen mit <code>Python</code> und <em>modernen Frameworks</em>.</p>
<blockquote>
<p>Einfachheit ist die ultimative Sophistizierung.</p>
</blockquote>
</article>
"""
markdown = md(html)
print(markdown)
Ausgabe:
## Modernes Webentwicklung
Erstellen mit `Python` und *modernen Frameworks*.
> Einfachheit ist die ultimative Sophistizierung.
Erweiterte Verwendung mit benutzerdefinierten Handlers:
from markdownify import MarkdownConverter
class CustomConverter(MarkdownConverter):
"""
Erstellen Sie einen benutzerdefinierten Konverter mit spezifischem Tag-Handling
"""
def convert_img(self, el, text, convert_as_inline):
"""Benutzerdefiniertes Bildhandler mit Alt-Text"""
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):
"""Erweitertes Codeblock-Handling mit Spracherkennung"""
code = el.find('code')
if code:
# Sprache aus der Klasseattribut extrahieren (z. B. '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'
# Benutzerdefinierten Konverter verwenden
html = '<pre><code class="language-python">def hello():\n print("world")</code></pre>'
markdown = CustomConverter().convert(html)
print(markdown)
Für weitere Details zu Markdown-Codeblöcken und Syntaxhervorhebung, siehe unseren Leitfaden zu Markdown-Codeblöcken.
Selektives Tag-Konvertieren:
from markdownify import markdownify as md
# Bestimmte Tags vollständig entfernen
markdown = md(html, strip=['script', 'style', 'nav'])
# Nur bestimmte Tags konvertieren
markdown = md(
html,
heading_style="ATX", # # für Überschriften verwenden
bullets="-", # - für Aufzählungen verwenden
strong_em_symbol="*", # * für Betonung verwenden
)
Vorteile:
- Auf BeautifulSoup4 basiert (robustes HTML-Parsing)
- Sehr anpassbar durch Vererbung
- Aktive Pflege
- Gute Dokumentation
Nachteile:
- BS4-Abhängigkeit erforderlich
- Kann bei großen Dokumenten langsamer sein
- Begrenzte eingebaute Tabellenunterstützung
Beste für: Anpassungsvorhaben, Projekte, die bereits BS4 verwenden
3. html-to-markdown - Das moderne Powerwerkzeug
html-to-markdown ist eine vollständig typisierte, moderne Bibliothek mit umfassender HTML5-Unterstützung und umfangreichen Konfigurationsoptionen.
Installation:
pip install html-to-markdown
Grundlegende Verwendung:
from html_to_markdown import convert
html = """
<article>
<h1>Technische Dokumentation</h1>
<table>
<thead>
<tr>
<th>Funktion</th>
<th>Unterstützung</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)
Erweiterte Konfiguration:
from html_to_markdown import convert, Options
# Erstellen Sie benutzerdefinierte Optionen
options = Options(
heading_style="ATX",
bullet_style="-",
code_language_default="python",
strip_tags=["script", "style"],
escape_special_chars=True,
table_style="pipe", # | für Tabellen verwenden
preserve_whitespace=False,
extract_metadata=True, # Metatags extrahieren
)
markdown = convert(html, options=options)
Befehlszeilen-Interface:
# Einzelne Datei konvertieren
html-to-markdown input.html -o output.md
# Mit Optionen konvertieren
html-to-markdown input.html \
--heading-style atx \
--strip-tags script,style \
--extract-metadata
# Batch-Konvertierung
find ./html_files -name "*.html" -exec html-to-markdown {} -o ./markdown_files/{}.md \;
Vorteile:
- Vollständige HTML5-Unterstützung einschließlich semantischer Elemente
- Typsicher mit umfassenden Typ-Hinweisen
- Erweiterte Tabellenverarbeitung (zusammengeführte Zellen, Ausrichtung)
- Metadatenextraktionsfähigkeit
- Aktive Entwicklung und moderner Codebasis
Nachteile:
- Python 3.9+ erforderlich
- Größere Abhängigkeitsstruktur
- Steilere Lernkurve
Beste für: Komplexe HTML5-Dokumente, typsichere Projekte, Produktionsumgebungen
4. trafilatura - Der Spezialist für Inhaltsextraktion
trafilatura ist nicht nur ein HTML-zu-Markdown-Konverter – es ist eine intelligente Inhaltsextraktionsbibliothek, speziell für Web-Scraping und Artikel-Extraktion entwickelt.
Installation:
pip install trafilatura
Grundlegende Verwendung:
import trafilatura
# Herunterladen und extrahieren aus URL
url = "https://example.com/article"
downloaded = trafilatura.fetch_url(url)
markdown = trafilatura.extract(downloaded, output_format='markdown')
print(markdown)
Hinweis: Trafilatura enthält eingebaute URL-Abfrage, aber bei komplexeren HTTP-Operationen können Sie unsere cURL Cheatsheet bei der Arbeit mit APIs oder authentifizierten Endpunkten hilfreich finden.
Erweiterte Inhaltsextraktion:
import trafilatura
from trafilatura.settings import use_config
# Erstellen Sie eine benutzerdefinierte Konfiguration
config = use_config()
config.set("DEFAULT", "EXTRACTION_TIMEOUT", "30")
html = """
<html>
<head><title>Artikel Titel</title></head>
<body>
<nav>Navigation menu</nav>
<article>
<h1>Hauptartikel</h1>
<p>Wichtiger Inhalt hier.</p>
</article>
<aside>Werbeanzeige</aside>
<footer>Fußzeile</footer>
</body>
</html>
"""
# Nur Hauptinhalt extrahieren
markdown = trafilatura.extract(
html,
output_format='markdown',
include_comments=False,
include_tables=True,
include_images=True,
include_links=True,
config=config
)
# Mit Metadaten extrahieren
result = trafilatura.extract(
html,
output_format='markdown',
with_metadata=True
)
if result:
print(f"Titel: {result.get('title', 'N/A')}")
print(f"Autor: {result.get('author', 'N/A')}")
print(f"Datum: {result.get('date', 'N/A')}")
print(f"\nInhalt:\n{result.get('text', '')}")
Batchverarbeitung:
import trafilatura
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
def process_url(url):
"""Markdown aus URL extrahieren"""
downloaded = trafilatura.fetch_url(url)
if downloaded:
return trafilatura.extract(
downloaded,
output_format='markdown',
include_links=True,
include_images=True
)
return None
# Mehrere URLs parallel verarbeiten
urls = [
"https://example.com/article1",
"https://example.com/article2",
"https://example.com/article3",
]
with ThreadPoolExecutor(max_workers=5) as executor:
results = list(executor.map(process_url, urls))
for i, markdown in enumerate(results):
if markdown:
Path(f"article_{i}.md").write_text(markdown, encoding='utf-8')
Vorteile:
- Intelligente Inhaltsextraktion (entfernt Boilerplate)
- Eingebaute URL-Abfrage mit robuster Fehlerbehandlung
- Metadatenextraktion (Titel, Autor, Datum)
- Spracherkennung
- Optimiert für Nachrichtenartikel und Blogposts
- Schnelles C-basiertes Parsing
Nachteile:
- Vielleicht zu viel Inhalt für allgemeines HTML entfernt
- Fokussiert auf Artikel-Extraktion (nicht allgemein)
- Konfigurationskomplexität für Randfälle
Beste für: Web-Scraping, Artikel-Extraktion, LLM-Trainingdatenvorbereitung
5. domscribe - Der Semantik-Bevormundung
domscribe konzentriert sich darauf, die semantische Bedeutung von HTML während der Konvertierung in Markdown zu bewahren.
Installation:
pip install domscribe
Grundlegende Verwendung:
from domscribe import html_to_markdown
html = """
<article>
<header>
<h1>Verständnis für semantisches HTML</h1>
<time datetime="2024-10-24">24. Oktober 2024</time>
</header>
<section>
<h2>Einführung</h2>
<p>Semantisches HTML verleiht <mark>Bedeutung</mark> zu Inhalten.</p>
</section>
<aside>
<h3>Verwandte Themen</h3>
<ul>
<li>Barrierefreiheit</li>
<li>SEO</li>
</ul>
</aside>
</article>
"""
markdown = html_to_markdown(html)
print(markdown)
Benutzerdefinierte Optionen:
from domscribe import html_to_markdown, MarkdownOptions
options = MarkdownOptions(
preserve_semantic_structure=True,
include_aria_labels=True,
strip_empty_elements=True
)
markdown = html_to_markdown(html, options=options)
Vorteile:
- Bewahrt semantisches HTML5-Struktur
- Behandelt moderne Webkomponenten gut
- Saubere API-Design
Nachteile:
- Noch in der frühen Entwicklung (API kann sich ändern)
- Begrenzte Dokumentation im Vergleich zu reifen Alternativen
- Kleineres Community und weniger Beispiele verfügbar
Beste für: Semantisches HTML5-Dokumente, barrierefreiheitsorientierte Projekte, wenn die Erhaltung der HTML5-semantischen Struktur entscheidend ist
Hinweis: Obwohl domscribe neuer und weniger getestet als Alternativen ist, füllt es eine spezifische Nische für die Erhaltung von semantischem HTML, die andere Tools nicht priorisieren.
6. html2md - Das asynchrone Powerwerkzeug
html2md ist für Hochleistungsbatchkonvertierungen mit asynchroner Verarbeitung konzipiert.
Installation:
pip install html2md
Befehlszeilenverwendung:
# Ganzen Ordner konvertieren
m1f-html2md convert ./website -o ./docs
# Mit benutzerdefinierten Einstellungen
m1f-html2md convert ./website -o ./docs \
--remove-tags nav,footer \
--heading-offset 1 \
--detect-language
# Einzelne Datei konvertieren
m1f-html2md convert index.html -o readme.md
Programmatische Verwendung:
import asyncio
from html2md import convert_html
async def convert_files():
"""Asynchrone Batchkonvertierung"""
html_files = [
'page1.html',
'page2.html',
'page3.html'
]
tasks = [convert_html(file) for file in html_files]
results = await asyncio.gather(*tasks)
return results
# Konvertierung starten
results = asyncio.run(convert_files())
Vorteile:
- Asynchrone Verarbeitung für hohe Leistung
- Intelligente Inhaltsauswahlerkennung
- YAML-Frontmatter-Generierung (großartig für Hugo!)
- Code-Spracherkennung
- Parallelverarbeitungssupport
Nachteile:
- Python 3.10+ erforderlich
- CLI-fokussiert (weniger flexibles API)
- Dokumentation könnte umfassender sein
Beste für: Große Migrationen, Batchkonvertierungen, Hugo/Jekyll-Migrationen
Leistungsbenchmarks
Leistung spielt eine Rolle, besonders wenn Tausende von Dokumenten für LLM-Training oder große Migrationen verarbeitet werden. Das Verständnis der relativen Geschwindigkeitsunterschiede zwischen Bibliotheken hilft Ihnen bei informierten Entscheidungen für Ihren Workflow.
Vergleichende Leistungsanalyse:
Basierend auf typischen Nutzungsmustern, hier ist, wie diese Bibliotheken in drei realistischen Szenarien vergleichen:
- Einfaches HTML: Einfacher Blogbeitrag mit Text, Überschriften und Links (5KB)
- Komplexes HTML: Technische Dokumentation mit verschachtelten Tabellen und Codeblöcken (50KB)
- Echte Website: Vollständige Webseite einschließlich Navigation, Fußzeile, Sidebar und Werbung (200KB)
Hier ist ein Beispielbenchmark-Code, den Sie verwenden können, um diese Bibliotheken selbst zu testen:
import time
import html2text
from markdownify import markdownify
from html_to_markdown import convert
import trafilatura
def benchmark(html_content, iterations=100):
"""Benchmark-Konvertierungsgeschwindigkeit"""
# 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': html2text_time,
'markdownify': markdownify_time,
'html-to-markdown': html_to_markdown_time,
'trafilatura': trafilatura_time
}
Typische Leistungsmerkmale (repräsentative relative Geschwindigkeiten):
| Paket | Einfach (5KB) | Komplex (50KB) | Echte Seite (200KB) |
|---|---|---|---|
| html2text | Mittel | Langsamer | Langsamer |
| markdownify | Langsamer | Langsamer | Langsamst |
| html-to-markdown | Schnell | Schnell | Schnell |
| trafilatura | Schnell | Sehr schnell | Sehr schnell |
| html2md (asynchron) | Sehr schnell | Sehr schnell | Schnellst |
Wichtige Beobachtungen:
html2mdundtrafilaturasind für komplexe Dokumente am schnellsten, was sie ideal für Batchverarbeitung machthtml-to-markdownbietet das beste Gleichgewicht zwischen Geschwindigkeit und Funktionen für Produktionsumgebungenmarkdownifyist langsamer, aber am flexibelsten – der Kompromiss lohnt sich, wenn Sie benutzerdefinierte Handler benötigenhtml2textzeigt sein Alter mit langsamerer Leistung, bleibt aber stabil für einfache Anwendungsfälle
Hinweis: Leistungsunterschiede werden erst bei der Verarbeitung von Hunderten oder Tausenden von Dateien signifikant. Für gelegentliche Konvertierungen ist jedes Paket gut genug. Konzentrieren Sie sich stattdessen auf Funktionen und Anpassungsoptionen.
Reale Anwendungsfälle
Theorie ist hilfreich, aber praktische Beispiele zeigen, wie diese Tools in der Produktion funktionieren. Hier sind vier gängige Szenarien mit vollständigem, produktionsrechtem Code, den Sie für Ihre eigenen Projekte anpassen können.
Anwendungsfall 1: Vorbereitung von LLM-Trainingdaten
Anforderung: Reinigen Sie Text aus Tausenden von Dokumentationsseiten
Empfohlen: trafilatura + parallele Verarbeitung
import trafilatura
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor
def process_html_file(html_path):
"""HTML-Datei in Markdown konvertieren"""
html = Path(html_path).read_text(encoding='utf-8')
markdown = trafilatura.extract(
html,
output_format='markdown',
include_links=False, # Für sauberere Trainingsdaten entfernen
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
# 10.000 Dateien parallel verarbeiten
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"Verarbeitet {len(html_files)} Dateien")
print(f"Gesamte Zeichen: {sum(token_counts):,}")
Anwendungsfall 2: Hugo-Blog-Migration
Anforderung: WordPress-Blog in Hugo migrieren mit Frontmatter
Empfohlen: html2md CLI
Hugo ist ein beliebter statischer Seiten-Generator, der Markdown für Inhalte verwendet. Für weitere Hugo-spezifische Tipps, schauen Sie sich unsere Hugo Cheatsheet an und erfahren Sie mehr über Strukturierte Daten-Markup hinzufügen zu Hugo-Website für bessere SEO. Unser Dokumentations-Tools-Hub hat weitere Leitfäden zu Markdown-Workflows und Dokumentenkonvertierung.
# Alle Beiträge mit Frontmatter konvertieren
m1f-html2md convert ./wordpress-export \
-o ./hugo/content/posts \
--generate-frontmatter \
--heading-offset 0 \
--remove-tags script,style,nav,footer
Oder programmatisch:
from html_to_markdown import convert, Options
from pathlib import Path
import yaml
def migrate_post(html_file):
"""WordPress HTML in Hugo Markdown konvertieren"""
html = Path(html_file).read_text()
# Titel und Datum aus HTML extrahieren
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
title = soup.find('h1').get_text() if soup.find('h1') else 'Unbenannt'
# In Markdown konvertieren
options = Options(strip_tags=['script', 'style', 'nav', 'footer'])
markdown = convert(html, options=options)
# Hugo Frontmatter hinzufügen
frontmatter = {
'title': title,
'date': '2024-10-24',
'draft': False,
'tags': []
}
output = f"---\n{yaml.dump(frontmatter)}---\n\n{markdown}"
# Speichern
output_file = html_file.replace('.html', '.md')
Path(output_file).write_text(output, encoding='utf-8')
# Alle Beiträge verarbeiten
for html_file in Path('./wordpress-export').glob('*.html'):
migrate_post(html_file)
Anwendungsfall 3: Dokumenten-Scraper mit benutzerdefinierter Formatierung
Anforderung: Technische Dokumente mit benutzerdefinierten Codeblöcken extrahieren
Empfohlen: markdownify mit benutzerdefiniertem Konverter
Dieser Ansatz ist besonders nützlich für die Migration von Dokumentationen aus Wiki-Systemen. Wenn Sie Dokumentationen verwalten, könnten Sie auch an DokuWiki - selbstgehostetes Wiki und Alternativen für selbstgehostete Dokumentationslösungen interessiert sein.
from markdownify import MarkdownConverter
import requests
class DocsConverter(MarkdownConverter):
"""Benutzerdefinierter Konverter für technische Dokumentation"""
def convert_pre(self, el, text, convert_as_inline):
"""Erweitertes Codeblock mit Syntaxhervorhebung"""
code = el.find('code')
if code:
# Sprache aus der Klasse extrahieren
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):
"""Behandlung spezieller Dokumentationsblöcke"""
classes = el.get('class', [])
# Warnungsblöcke
if 'warning' in classes:
return f'\n> ⚠️ **Warnung**: {text}\n'
# Info-Blöcke
if 'info' in classes or 'note' in classes:
return f'\n> 💡 **Hinweis**: {text}\n'
return text
def scrape_docs(url):
"""Dokumentationsseite scrapen und konvertieren"""
response = requests.get(url)
markdown = DocsConverter().convert(response.text)
return markdown
# Verwenden Sie es
docs_url = "https://docs.example.com/api-reference"
markdown = scrape_docs(docs_url)
Path('api-reference.md').write_text(markdown)
Anwendungsfall 4: Newsletter in Markdown-Archiv konvertieren
Anforderung: HTML-Newsletter in lesbare Markdown-Archive konvertieren
Empfohlen: html2text mit spezifischen Konfigurationen
import html2text
import email
from pathlib import Path
def convert_newsletter(email_file):
"""HTML-Newsletter in Markdown konvertieren"""
# E-Mail parsen
with open(email_file, 'r') as f:
msg = email.message_from_file(f)
# HTML-Teil erhalten
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
# Konverter konfigurieren
h = html2text.HTML2Text()
h.ignore_images = False
h.images_to_alt = True
h.body_width = 0
h.protect_links = True
h.unicode_snob = True
# Konvertieren
markdown = h.handle(html_content)
# Metadaten hinzufügen
subject = msg.get('Subject', 'Kein Betreff')
date = msg.get('Date', '')
output = f"# {subject}\n\n*Datum: {date}*\n\n---\n\n{markdown}"
return output
# Newsletter-Archiv verarbeiten
for email_file in Path('./newsletters').glob('*.eml'):
markdown = convert_newsletter(email_file)
if markdown:
output_file = email_file.with_suffix('.md')
output_file.write_text(markdown, encoding='utf-8')
Empfehlungen nach Szenario
Noch unsicher, welche Bibliothek Sie wählen sollen? Hier ist ein Leitfaden basierend auf spezifischen Anwendungsfällen.
Für Web-Scraping und LLM-Vorverarbeitung
Gewinner: trafilatura
Trafilatura excels darin, sauberen Inhalt zu extrahieren, während Boilerplate entfernt wird. Perfekt für:
- Erstellung von LLM-Training-Datasets
- Inhaltsaggregation
- Forschungspapier-Sammlung
- Nachrichtenartikel-Extraktion
Für Hugo/Jekyll-Migrationen
Gewinner: html2md
Asynchrone Verarbeitung und Frontmatter-Generierung machen Bulk-Migrationen schnell und einfach:
- Batch-Konvertierung
- Automatische Metadatenextraktion
- YAML-Frontmatter-Generierung
- Anpassung der Überschriftenebene
Für benutzerdefinierte Konvertierungslogik
Gewinner: markdownify
Erweitern Sie den Konverter für vollständige Kontrolle:
- Benutzerdefinierte Tag-Handler
- Domänenspezifische Konvertierungen
- Spezielle Formatierungsanforderungen
- Integration mit bestehendem BeautifulSoup-Code
Für Typ-sichere Produktionsumgebungen
Gewinner: html-to-markdown
Modern, typsicher und umfassend:
- Vollständige HTML5-Unterstützung
- Umfassende Typ-Hinweise
- Erweiterte Tabellenverarbeitung
- Aktive Pflege
Für einfache, stabile Konvertierungen
Gewinner: html2text
Wenn Sie etwas benötigen, das „einfach funktioniert“:
- Keine Abhängigkeiten
- Battle-tested
- Umfangreiche Konfiguration
- Weite Plattformunterstützung
Best Practices for LLM Preprocessing
Unabhängig davon, welche Bibliothek Sie wählen, folgen Sie diesen Best Practices, um eine hochwertige Markdown-Ausgabe zu gewährleisten, die für die Verarbeitung durch LLMs optimiert ist. Diese Muster haben sich in Produktionsworkflows, die Millionen von Dokumenten verarbeiten, als unverzichtbar erwiesen.
1. Reinigen vor der Konvertierung
Entfernen Sie immer unerwünschte Elemente vor der Konvertierung, um eine sauberere Ausgabe und bessere Leistung zu erzielen:
from bs4 import BeautifulSoup
import trafilatura
def clean_and_convert(html):
"""Unerwünschte Elemente vor der Konvertierung entfernen"""
soup = BeautifulSoup(html, 'html.parser')
# Unerwünschte Elemente entfernen
for element in soup(['script', 'style', 'nav', 'footer', 'header', 'aside']):
element.decompose()
# Werbung und Tracking entfernen
for element in soup.find_all(class_=['ad', 'advertisement', 'tracking']):
element.decompose()
# Konvertieren Sie das bereinigte HTML
markdown = trafilatura.extract(
str(soup),
output_format='markdown'
)
return markdown
2. Whitespace normalisieren
Verschiedene Konverter behandeln Whitespace unterschiedlich. Normalisieren Sie die Ausgabe, um Konsistenz in Ihrem Corpus zu gewährleisten:
import re
def normalize_markdown(markdown):
"""Markdown-Abstände bereinigen"""
# Mehrfache Leerzeilen entfernen
markdown = re.sub(r'\n{3,}', '\n\n', markdown)
# Schlusszeichen entfernen
markdown = '\n'.join(line.rstrip() for line in markdown.split('\n'))
# Einzelnen Zeilenumbruch am Ende sicherstellen
markdown = markdown.rstrip() + '\n'
return markdown
3. Ausgabe validieren
Qualitätskontrolle ist entscheidend. Implementieren Sie Validierung, um Konvertierungsfehler frühzeitig zu erkennen:
def validate_markdown(markdown):
"""Markdown-Qualität validieren"""
issues = []
# Prüfen auf verbleibende HTML-Elemente
if '<' in markdown and '>' in markdown:
issues.append("HTML-Tags erkannt")
# Prüfen auf beschädigte Links
if '[' in markdown and ']()' in markdown:
issues.append("Leerer Link erkannt")
# Prüfen auf zu viele Codeblöcke
code_block_count = markdown.count('```')
if code_block_count % 2 != 0:
issues.append("Nicht geschlossener Codeblock")
return len(issues) == 0, issues
4. Batch-Verarbeitungsvorlage
Bei der Verarbeitung großer Dokumentensammlungen verwenden Sie diese Produktionsvorlage mit ordnungsgemäßer Fehlerbehandlung, Protokollierung und paralleler Verarbeitung:
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):
"""Einzelnes HTML-Datei verarbeiten"""
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:
# Normalisieren
markdown = normalize_markdown(markdown)
# Validieren
is_valid, issues = validate_markdown(markdown)
if not is_valid:
logger.warning(f"{html_path}: {', '.join(issues)}")
# Speichern
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"Fehler beim Verarbeiten von {html_path}: {e}")
return False
def batch_convert(input_dir, max_workers=4):
"""Alle HTML-Dateien in einem Verzeichnis konvertieren"""
html_files = list(Path(input_dir).rglob('*.html'))
logger.info(f"{len(html_files)} HTML-Dateien gefunden")
with ProcessPoolExecutor(max_workers=max_workers) as executor:
results = list(executor.map(process_file, html_files))
success_count = sum(results)
logger.info(f"{success_count}/{len(html_files)} Dateien erfolgreich konvertiert")
# Verwendung
batch_convert('./html_docs', max_workers=8)
Schlussfolgerung
Das Python-Ökosystem bietet reife, produktionsreife Tools zur Konvertierung von HTML in Markdown, die jeweils für unterschiedliche Szenarien optimiert sind. Ihre Wahl sollte sich mit Ihren spezifischen Anforderungen decken:
- Schnelle Konvertierungen: Nutzen Sie
html2textaufgrund seiner Einfachheit und Abwesenheit von Abhängigkeiten - Individuelle Logik: Nutzen Sie
markdownifyfür maximale Flexibilität durch Vererbung - Web-Scraping: Nutzen Sie
trafilaturafür intelligentes Inhaltsextrahieren mit Entfernung von Boilerplate - Großvolumige Migrationen: Nutzen Sie
html2mdfür asynchrone Leistung bei großen Projekten - Produktionssysteme: Nutzen Sie
html-to-markdownfür Typsicherheit und umfassende HTML5-Unterstützung - Semantische Erhaltung: Nutzen Sie
domscribezur Erhaltung der HTML5-semantischen Struktur
Empfehlungen für LLM-Workflows
Für LLM-Präprozessierungsworkflows wird ein zweistufiger Ansatz empfohlen:
- Starten Sie mit
trafilaturafür die anfängliche Inhaltsextraktion – es entfernt intelligent Navigation, Werbung und Boilerplate, während es den Hauptinhalt beibehält - Wechseln Sie zu
html-to-markdownfür komplexe Dokumente, die präzise Strukturbeibehaltung erfordern, wie technische Dokumentation mit Tabellen und Codeblöcken
Diese Kombination bewältigt effektiv 95 % der realen Szenarien.
Nächste Schritte
Für weitere Leitfäden zu Markdown, LaTeX, PDF-Verarbeitung und Dokumentdruckworkflows siehe Dokumentationswerkzeuge im Jahr 2026: Markdown, LaTeX, PDF & Druckworkflows.
Alle diese Tools (außer html2text) werden aktiv gepflegt und sind für die Produktion bereit. Es ist besser:
- 2-3 Bibliotheken zu installieren, die Ihrem Anwendungsfall entsprechen
- Sie mit Ihren tatsächlichen HTML-Beispielen zu testen
- Ihre typischen Dokumentgrößen hinsichtlich der Leistung zu benchmarken
- Auf Basis der Ausgabeklasse, nicht nur der Geschwindigkeit, zu wählen
Das Python-Ökosystem für die Konvertierung von HTML in Markdown hat sich erheblich weiterentwickelt, und Sie können mit allen diesen Optionen für ihre vorgesehenen Anwendungsfälle nicht falsch liegen.
Zusätzliche Ressourcen
- html2text Dokumentation
- markdownify auf PyPI
- html-to-markdown auf GitHub
- trafilatura Dokumentation
- html2md Dokumentation
- domscribe auf PyPI
Hinweis: Diese Vergleichsliste basiert auf der Analyse der offiziellen Dokumentation, der Community-Feedbacks und der Bibliotheksarchitektur. Die Leistungsmerkmale sind repräsentativ für typische Verwendungsmuster. Für spezifische Anwendungsfälle führen Sie Ihre eigenen Benchmarks mit Ihren tatsächlichen HTML-Beispielen durch.
Andere nützliche Artikel
- Dokumentationswerkzeuge im Jahr 2026: Markdown, LaTeX, PDF & Druckworkflows
- Markdown Cheatsheet
- Verwenden von Markdown Codeblöcken
- Word-Dokumente in Markdown konvertieren: Ein vollständiger Leitfaden
- HTML-Inhalt in Markdown konvertieren mit LLM und Ollama
- cURL Cheatsheet
- Hugo Static Site Generator Cheatsheet
- Dokuwiki – selbstgehosteter Wiki und Alternativen
- Verwenden von Obsidian für persönliche Wissensverwaltung