HTML zu Markdown mit Python umwandeln: Ein umfassender Leitfaden
Python zum Konvertieren von HTML in sauberes, LLM-optimiertes Markdown
Konvertierung von HTML zu Markdown ist eine grundlegende Aufgabe in modernen Entwicklungsworkflows, insbesondere bei der Vorbereitung von Webinhalten für Large Language Models (LLMs), Dokumentationssysteme oder statische Site-Generatoren wie Hugo.
Während HTML für Webbrowser mit reichhaltiger Formatierung und Struktur entwickelt wurde, bietet Markdown ein sauberes, lesbares Format, das ideal für Textverarbeitung, Versionskontrolle und die Verarbeitung durch KI ist. Wenn Sie neu in der Markdown-Syntax sind, werfen Sie einen Blick auf unseren Markdown-Cheatsheet für eine umfassende Referenz.

In dieser umfassenden Übersicht werden wir sechs Python-Pakete zur Konvertierung von HTML zu Markdown untersuchen, praktische Code-Beispiele, Leistungsbenchmarks und reale Anwendungsfälle bereitstellen. Ob Sie eine LLM-Trainingspipeline aufbauen, einen Blog zu Hugo migrieren oder Dokumentationen extrahieren – Sie werden das perfekte Werkzeug für Ihren Workflow finden.
Alternative Methode: Wenn Sie eine intelligentere Inhaltsextraktion mit semantischem Verständnis benötigen, könnten Sie auch die Konvertierung von HTML zu Markdown mit LLM und Ollama in Betracht ziehen, die eine KI-gestützte Konvertierung für komplexe Layouts bietet.
Was Sie lernen werden:
- Detaillierter Vergleich von 6 Bibliotheken mit Vor- und Nachteilen für jede
- Leistungsbenchmarks mit realen HTML-Beispielen
- Produktionsreife Code-Beispiele für häufige Anwendungsfälle
- Best Practices für LLM-Vorverarbeitungs-Workflows
- Spezifische Empfehlungen basierend auf Ihren Anforderungen
Warum Markdown für die LLM-Vorverarbeitung?
Bevor wir uns in die Tools vertiefen, verstehen wir, warum Markdown besonders wertvoll für LLM-Workflows ist:
- Token-Effizienz: Markdown verwendet deutlich weniger Tokens als HTML für denselben Inhalt
- Semantische Klarheit: Markdown erhält die Dokumentenstruktur ohne umständliche Tags
- Lesbarkeit: Sowohl Menschen als auch LLMs können die Markdown-Syntax leicht verstehen
- Konsistenz: Standardisiertes Format reduziert Mehrdeutigkeiten in den Modelleingaben
- Speicherplatz: 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 es in Wissensmanagementsystemen wie Obsidian für persönliches Wissensmanagement einsetzen.
TL;DR - Schnellvergleichsmatrix
Wenn Sie es eilig haben, hier 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 | Vollständig | Vollständig | Vollständig | Vollständig |
| Typ-Hinweise | Nein | Nein | Ja | Teilweise | Nein | Teilweise |
| Benutzerdefinierte Handler | Eingeschränkt | Hervorragend | Gut | Eingeschränkt | Gut | Eingeschränkt |
| Tabellenunterstützung | Grundlegend | Grundlegend | Fortgeschritten | Gut | Gut | Gut |
| Asynchrone Unterstützung | Nein | Nein | Nein | Nein | Nein | Ja |
| Inhaltsextraktion | Nein | Nein | Nein | Hervorragend | Nein | Gut |
| Metadaten-Extraktion | Nein | Nein | Ja | Hervorragend | Nein | Ja |
| CLI-Werkzeug | Nein | Nein | Ja | Ja | Nein | Ja |
| Geschwindigkeit | Mittel | Langsam | Schnell | Sehr schnell | Mittel | Sehr schnell |
| Aktive Entwicklung | Nein | Ja | Ja | Ja | Eingeschränkt | Ja |
| Python-Version | 3.6+ | 3.7+ | 3.9+ | 3.6+ | 3.8+ | 3.10+ |
| Abhängigkeiten | Keine | BS4 | lxml | lxml | BS4 | aiohttp |
Schnellauswahlführer:
- Benötigen Sie Geschwindigkeit? → trafilatura oder html2md
- Benötigen Sie Anpassung? → markdownify
- Benötigen Sie Typsicherheit? → html-to-markdown
- Benötigen Sie Einfachheit? → html2text
- Benötigen Sie Inhaltsextraktion? → trafilatura
Die Kandidaten: 6 Python-Pakete im Vergleich
Lassen Sie uns jeden Bibliothek mit praktischen Code-Beispielen, Konfigurationsoptionen und realen Einblicken detailliert untersuchen. Jeder Abschnitt enthält Installationsanweisungen, Nutzungsmuster und ehrliche Bewertungen der Stärken und Grenzen.
1. html2text - Die klassische Wahl
Ursprünglich von Aaron Swartz entwickelt, ist html2text seit über einem Jahrzehnt ein fester Bestandteil des Python-Ökosystems. Es konzentriert sich auf die Erstellung von sauberem, lesbarem Markdown-Output.
Installation:
pip install html2text
Grundlegende Nutzung:
import html2text
# Erstellen Sie eine Converter-Instanz
h = html2text.HTML2Text()
# Konfigurieren Sie die Optionen
h.ignore_links = False
h.ignore_images = False
h.ignore_emphasis = False
h.body_width = 0 # Zeilen nicht umbrechen
html_content = """
<h1>Willkommen beim Web Scraping</h1>
<p>Dies ist ein <strong>umfassender Leitfaden</strong> zur Inhaltsextraktion.</p>
<ul>
<li>Einfach zu verwenden</li>
<li>Erprobt im Einsatz</li>
<li>Weit verbreitet</li>
</ul>
<a href="https://example.com">Mehr erfahren</a>
"""
markdown = h.handle(html_content)
print(markdown)
Ausgabe:
# Willkommen beim Web Scraping
Dies ist ein **umfassender Leitfaden** zur Inhaltsextraktion.
* Einfach zu verwenden
* Erprobt im Einsatz
* Weit verbreitet
[Mehr erfahren](https://example.com)
Erweiterte Konfiguration:
import html2text
h = html2text.HTML2Text()
# Überspringen bestimmter Elemente
h.ignore_links = True
h.ignore_images = True
# Steuerung der Formatierung
h.body_width = 80 # Bei 80 Zeichen umbrechen
h.unicode_snob = True # Unicode-Zeichen verwenden
h.emphasis_mark = '*' # * für Hervorhebung statt _ verwenden
h.strong_mark = '**'
# Tabellen verarbeiten
h.ignore_tables = False
# Vorformatierten Text schützen
h.protect_links = True
Vorteile:
- Reif und stabil (15+ Jahre Entwicklung)
- Umfangreiche Konfigurationsoptionen
- Behandelt Randfälle gut
- Keine externen Abhängigkeiten
Nachteile:
- Eingeschränkte HTML5-Unterstützung
- Kann ungleichmäßige Abstände erzeugen
- Wird nicht aktiv gepflegt (letzte große Aktualisierung 2020)
- Nur einkanalige Verarbeitung
Beste Verwendung: Einfache HTML-Dokumente, Legacy-Systeme, wenn Stabilität entscheidend ist
Moderne Webentwicklung
Erstellung mit Python und modernen Frameworks.
Einfachheit ist die höchste Form der Eleganz.
Erweiterte Nutzung mit benutzerdefinierten Handlern:
from markdownify import MarkdownConverter
class CustomConverter(MarkdownConverter):
"""
Erstellen Sie einen benutzerdefinierten Converter mit spezifischer Tag-Verarbeitung
"""
def convert_img(self, el, text, convert_as_inline):
"""Benutzerdefinierter Bild-Handler 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):
"""Verbesserte Code-Block-Verarbeitung mit Spracherkennung"""
code = el.find('code')
if code:
# Extrahieren Sie die Sprache aus dem Klassenattribut (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'
# Verwenden Sie den benutzerdefinierten Converter
html = '<pre><code class="language-python">def hello():\n print("world")</code></pre>'
markdown = CustomConverter().convert(html)
print(markdown)
Für weitere Details zur Arbeit mit Markdown-Code-Blöcken und Syntax-Hervorhebung, siehe unsere Anleitung zu Verwendung von Markdown-Code-Blöcken.
Selektive Tag-Konvertierung:
from markdownify import markdownify as md
# Entfernen Sie bestimmte Tags vollständig
markdown = md(html, strip=['script', 'style', 'nav'])
# Konvertieren Sie nur bestimmte Tags
markdown = md(
html,
heading_style="ATX", # Verwenden Sie # für Überschriften
bullets="-", # Verwenden Sie - für Aufzählungszeichen
strong_em_symbol="*", # Verwenden Sie * für Hervorhebung
)
Vorteile:
- Basierend auf BeautifulSoup4 (robuste HTML-Analyse)
- Hochgradig anpassbar durch Subclassing
- Aktive Wartung
- Gute Dokumentation
Nachteile:
- Erfordert BeautifulSoup4-Abhängigkeit
- Kann für große Dokumente langsamer sein
- Begrenzte integrierte Tabellenunterstützung
Beste Verwendung: Benutzerdefinierte Konvertierungslogik, Projekte, die bereits BeautifulSoup4 verwenden
3. html-to-markdown - Der moderne Powerhouse
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>Merkmal</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", # Verwenden Sie | für Tabellen
preserve_whitespace=False,
extract_metadata=True, # Extrahieren Sie Meta-Tags
)
markdown = convert(html, options=options)
Command-Line-Interface:
# Konvertieren Sie eine einzelne Datei
html-to-markdown input.html -o output.md
# Konvertieren Sie mit Optionen
html-to-markdown input.html \
--heading-style atx \
--strip-tags script,style \
--extract-metadata
# Stapelverarbeitung
find ./html_files -name "*.html" -exec html-to-markdown {} -o ./markdown_files/{}.md \;
Vorteile:
- Volle HTML5-Unterstützung einschließlich semantischer Elemente
- Typsicher mit umfassenden Typ-Hinweisen
- Verbesserte Tabellenverarbeitung (zusammengeführte Zellen, Ausrichtung)
- Metadaten-Extraktionsfähigkeiten
- Aktive Entwicklung und moderner Code
Nachteile:
- Erfordert Python 3.9+
- Größerer Abhängigkeits-Fußabdruck
- Steilere Lernkurve
Beste Verwendung: Komplexe HTML5-Dokumente, typsichere Projekte, Produktionssysteme
4. trafilatura - Der Inhalts-Extraktions-Spezialist
trafilatura ist nicht nur ein HTML-zu-Markdown-Konverter – es ist eine intelligente Inhalts-Extraktionsbibliothek, die speziell für Web-Scraping und Artikel-Extraktion entwickelt wurde.
Installation:
pip install trafilatura
Grundlegende Verwendung:
import trafilatura
# Herunterladen und Extrahieren von 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-Abruf, aber für komplexere HTTP-Operationen könnten Sie unseren cURL Cheatsheet hilfreich finden, wenn Sie mit APIs oder authentifizierten Endpunkten arbeiten.
Erweiterte Inhalts-Extraktion:
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>Navigationsmenü</nav>
<article>
<h1>Hauptartikel</h1>
<p>Wichtiger Inhalt hier.</p>
</article>
<aside>Werbung</aside>
<footer>Fußzeileninhalt</footer>
</body>
</html>
"""
# Extrahieren Sie nur den Hauptinhalt
markdown = trafilatura.extract(
html,
output_format='markdown',
include_comments=False,
include_tables=True,
include_images=True,
include_links=True,
config=config
)
# Extrahieren Sie mit Metadaten
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', '')}")
Stapelverarbeitung:
import trafilatura
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
def process_url(url):
"""Extrahieren Sie Markdown von URL"""
downloaded = trafilatura.fetch_url(url)
if downloaded:
return trafilatura.extract(
downloaded,
output_format='markdown',
include_links=True,
include_images=True
)
return None
# Verarbeiten Sie mehrere URLs parallel
urls = [
"https://example.com/article1",
"https://example.com/article2",
"https://example.com/article3",
]
with ThreadPoolExecutor(max_workers=5) als 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 Inhalts-Extraktion (entfernt Boilerplate)
- Eingebauter URL-Abruf mit robuster Fehlerbehandlung
- Metadaten-Extraktion (Titel, Autor, Datum)
- Spracherkennung
- Optimiert für Nachrichtenartikel und Blogbeiträge
- Schnelle C-basierte Analyse
Nachteile:
- Kann für allgemeines HTML zu viel Inhalt entfernen
- Fokussiert auf Artikel-Extraktion (nicht allgemeiner Zweck)
- Konfigurationskomplexität für Randfälle
Beste Verwendung: Web-Scraping, Artikel-Extraktion, Vorbereitung von LLM-Trainingsdaten
5. domscribe - Der semantische Bewahrer
domscribe konzentriert sich darauf, die semantische Bedeutung von HTML zu erhalten, während es in Markdown konvertiert wird.
Installation:
pip install domscribe
Grundlegende Verwendung:
from domscribe import html_to_markdown
html = """
<article>
<header>
<h1>Verständnis von semantischem HTML</h1>
<time datetime="2024-10-24">24. Oktober 2024</time>
</header>
<section>
<h2>Einführung</h2>
<p>Semantisches HTML verleiht dem Inhalt <mark>Bedeutung</mark>.</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:
- Erhält die semantische HTML5-Struktur
- Verarbeitet moderne Webkomponenten gut
- Sauberes API-Design
Nachteile:
- Noch in der frühen Entwicklung (API kann sich ändern)
- Begrenzte Dokumentation im Vergleich zu etablierten Alternativen
- Kleinere Community und weniger Beispiele verfügbar
Beste Verwendung: Semantische HTML5-Dokumente, barrierefreie Projekte, wenn die Erhaltung der HTML5-Semantik entscheidend ist
Hinweis: Obwohl domscribe neuer und weniger erprobt ist als Alternativen, füllt es eine spezifische Nische für die Erhaltung semantischer HTML-Strukturen, die andere Tools nicht priorisieren.
6. html2md - Der asynchrone Powerhouse
html2md ist für Hochleistungs-Stapelkonvertierungen mit asynchroner Verarbeitung entwickelt.
Installation:
pip install html2md
Command-Line-Verwendung:
# Konvertieren Sie ein gesamtes Verzeichnis
m1f-html2md convert ./website -o ./docs
# Mit benutzerdefinierten Einstellungen
m1f-html2md convert ./website -o ./docs \
--remove-tags nav,footer \
--heading-offset 1 \
--detect-language
# Konvertieren Sie eine einzelne Datei
m1f-html2md convert index.html -o readme.md
Programmatische Verwendung:
import asyncio
from html2md import convert_html
async def convert_files():
"""Asynchrone Stapelkonvertierung"""
html_files = [
'page1.html',
'page2.html',
'page3.html'
]
tasks = [convert_html(file) for file in html_files]
results = await asyncio.gather(*tasks)
return results
# Führen Sie die Konvertierung aus
results = asyncio.run(convert_files())
Vorteile:
- Asynchrone Verarbeitung für hohe Leistung
- Intelligente Erkennung von Inhaltsselektoren
- YAML-Frontmatter-Generierung (großartig für Hugo!)
- Code-Spracherkennung
- Unterstützung für parallele Verarbeitung
Nachteile:
- Erfordert Python 3.10+
- CLI-fokussiert (weniger flexible API)
- Dokumentation könnte umfassender sein
Beste Verwendung: Groß angelegte Migrationen, Stapelkonvertierungen, Hugo/Jekyll-Migrationen
Leistungsbenchmarks
Leistung ist entscheidend, insbesondere beim Verarbeiten von tausenden Dokumenten für die LLM-Schulung oder groß angelegte Migrationsprozesse. Das Verständnis der relativen Geschwindigkeitsunterschiede zwischen Bibliotheken hilft Ihnen, fundierte Entscheidungen für Ihren Workflow zu treffen.
Vergleichende Leistungsanalyse:
Basierend auf typischen Nutzungsmustern vergleichen sich diese Bibliotheken wie folgt in drei realistischen Szenarien:
- Einfaches HTML: Grundlegender Blogbeitrag mit Text, Überschriften und Links (5KB)
- Komplexes HTML: Technische Dokumentation mit verschachtelten Tabellen und Code-Blöcken (50KB)
- Echte Website: Vollständige Webseite inklusive Navigation, Footer, Sidebar und Werbung (200KB)
Hier ist ein Beispiel-Benchmark-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-Test der Umwandlungsgeschwindigkeit"""
# 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 | Mäßig | Langsamer | Langsamer |
| markdownify | Langsamer | Langsamer | Langsamste |
| html-to-markdown | Schnell | Schnell | Schnell |
| trafilatura | Schnell | Sehr schnell | Sehr schnell |
| html2md (async) | Sehr schnell | Sehr schnell | Schnellste |
Wichtige Beobachtungen:
html2mdundtrafilaturasind am schnellsten für komplexe Dokumente, was sie ideal für Batch-Verarbeitung machthtml-to-markdownbietet das beste Gleichgewicht aus Geschwindigkeit und Funktionen für den Produktionsbetriebmarkdownifyist 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 Dateien signifikant. Für gelegentliche Umwandlungen funktioniert jede Bibliothek gut. Konzentrieren Sie sich stattdessen auf Funktionen und Anpassungsoptionen.
Praktische Anwendungsfälle
Theorie ist hilfreich, aber praktische Beispiele zeigen, wie diese Tools in der Produktion funktionieren. Hier sind vier häufige Szenarien mit vollständigem, produktionsbereitem Code, den Sie für Ihre eigenen Projekte anpassen können.
Anwendungsfall 1: Vorbereitung von LLM-Trainingsdaten
Anforderung: Extrahieren Sie sauberen Text aus tausenden Dokumentationsseiten
Empfohlen: trafilatura + parallele Verarbeitung
import trafilatura
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor
def process_html_file(html_path):
"""Konvertieren Sie eine HTML-Datei in Markdown"""
html = Path(html_path).read_text(encoding='utf-8')
markdown = trafilatura.extract(
html,
output_format='markdown',
include_links=False, # Entfernen Sie dies für sauberere Trainingsdaten
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
# Verarbeiten Sie 10.000 Dateien 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"Verarbeitet {len(html_files)} Dateien")
print(f"Gesamtzeichen: {sum(token_counts):,}")
Anwendungsfall 2: Hugo-Blog-Migration
Anforderung: Migrieren Sie einen WordPress-Blog zu Hugo mit Frontmatter
Empfohlen: html2md CLI
Hugo ist ein beliebter statischer Site-Generator, der Markdown für Inhalte verwendet. Für weitere Hugo-spezifische Tipps besuchen Sie unseren Hugo Cheat Sheet und erfahren Sie mehr über Hinzufügen von strukturierten Datenmarkierungen zu Hugo für bessere SEO.
# Konvertieren Sie alle Beiträge mit Frontmatter
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):
"""Konvertieren Sie WordPress-HTML in Hugo-Markdown"""
html = Path(html_file).read_text()
# Extrahieren Sie Titel und Datum aus HTML
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
title = soup.find('h1').get_text() if soup.find('h1') else 'Untitled'
# Konvertieren Sie in Markdown
options = Options(strip_tags=['script', 'style', 'nav', 'footer'])
markdown = convert(html, options=options)
# Fügen Sie Hugo-Frontmatter hinzu
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')
# Verarbeiten Sie alle Beiträge
for html_file in Path('./wordpress-export').glob('*.html'):
migrate_post(html_file)
Anwendungsfall 3: Dokumentations-Scraper mit benutzerdefiniertem Format
Anforderung: Scrapen Sie technische Dokumentationen mit benutzerdefinierter Code-Block-Verarbeitung
Empfohlen: markdownify mit benutzerdefiniertem Converter
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 - selbstgehostete Wiki und Alternativen für selbstgehostete Dokumentationslösungen interessiert sein.
from markdownify import MarkdownConverter
import requests
class DocsConverter(MarkdownConverter):
"""Benutzerdefinierter Converter für technische Dokumentationen"""
def convert_pre(self, el, text, convert_as_inline):
"""Verbesserter Code-Block mit Syntax-Hervorhebung"""
code = el.find('code')
if code:
# Extrahieren Sie Sprache aus Klasse
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):
"""Behandeln Sie spezielle Dokumentationsblöcke"""
classes = el.get('class', [])
# Warnblöcke
if 'warning' in classes:
return f'\n> ⚠️ **Warnung**: {text}\n'
# Infoblöcke
if 'info' in classes or 'note' in classes:
return f'\n> 💡 **Hinweis**: {text}\n'
return text
def scrape_docs(url):
"""Scrapen und konvertieren Sie eine Dokumentationsseite"""
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-Archiv in Markdown
Anforderung: Konvertieren Sie HTML-E-Mail-Newsletter in lesbare Markdown-Dateien
Empfohlen: html2text mit spezifischer Konfiguration
import html2text
import email
from pathlib import Path
def convert_newsletter(email_file):
"""Konvertieren Sie eine HTML-E-Mail in Markdown"""
# Parsen Sie die E-Mail
with open(email_file, 'r') as f:
msg = email.message_from_file(f)
# Holen Sie sich den HTML-Teil
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
# Konfigurieren Sie den 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
# Konvertieren
markdown = h.handle(html_content)
# Fügen Sie Metadaten hinzu
subject = msg.get('Subject', 'Kein Betreff')
date = msg.get('Date', '')
output = f"# {subject}\n\n*Datum: {date}*\n\n---\n\n{markdown}"
return output
# Verarbeiten Sie das Newsletter-Archiv
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
Immer noch unsicher, welche Bibliothek Sie wählen sollen? Hier ist mein definitiver Leitfaden basierend auf spezifischen Anwendungsfällen. Diese Empfehlungen stammen aus praktischer Erfahrung mit jeder Bibliothek in Produktionsumgebungen.
Für Web-Scraping & LLM-Vorverarbeitung
Gewinner: trafilatura
Trafilatura glänzt bei der Extraktion sauberer Inhalte und dem Entfernen von Boilerplate. Perfekt für:
- Aufbau von LLM-Trainingsdatasets
- Inhaltsaggregation
- Sammlung von Forschungsartikeln
- Extraktion von Nachrichtenartikeln
Für Hugo/Jekyll-Migrationen
Gewinner: html2md
Asynchrone Verarbeitung und Frontmatter-Generierung machen Massenmigrationen schnell und einfach:
- Batch-Umwandlungen
- Automatische Metadaten-Extraktion
- YAML-Frontmatter-Generierung
- Anpassung der Überschriftenebene
Für benutzerdefinierte Umwandlungslogik
Gewinner: markdownify
Erweitern Sie den Converter für vollständige Kontrolle:
- Benutzerdefinierte Tag-Handler
- Domänenspezifische Umwandlungen
- Spezielle Formatierungsanforderungen
- Integration mit bestehendem BeautifulSoup-Code
Für typensichere Produktionssysteme
Gewinner: html-to-markdown
Modern, typensicher und funktionsvollständig:
- Vollständige HTML5-Unterstützung
- Umfassende Typ-Hinweise
- Fortschrittliche Tabellenverarbeitung
- Aktive Wartung
Für einfache, stabile Umwandlungen
Gewinner: html2text
Wenn Sie etwas brauchen, das “einfach funktioniert”:
- Keine Abhängigkeiten
- Erprobt und zuverlässig
- Umfangreiche Konfiguration
- Breite Plattformunterstützung
Beste Praktiken für die Vorverarbeitung von LLMs
Unabhängig davon, welche Bibliothek Sie wählen, sorgen diese bewährten Praktiken für eine hochwertige Markdown-Ausgabe, die für die LLM-Verarbeitung optimiert ist. Diese Muster haben sich in Produktionsworkflows mit Millionen von Dokumenten als essenziell erwiesen.
1. Reinigen vor dem Konvertieren
Entfernen Sie immer unerwünschte Elemente vor der Umwandlung, um eine sauberere Ausgabe und bessere Leistung zu erzielen:
from bs4 import BeautifulSoup
import trafilatura
def clean_and_convert(html):
"""Entfernen unerwünschter Elemente vor der Umwandlung"""
soup = BeautifulSoup(html, 'html.parser')
# Entfernen unerwünschter Elemente
for element in soup(['script', 'style', 'nav', 'footer', 'header', 'aside']):
element.decompose()
# Entfernen von Anzeigen und Tracking
for element in soup.find_all(class_=['ad', 'advertisement', 'tracking']):
element.decompose()
# Konvertieren des gereinigten HTML
markdown = trafilatura.extract(
str(soup),
output_format='markdown'
)
return markdown
2. Normalisieren von Leerzeichen
Unterschiedliche Konverter behandeln Leerzeichen unterschiedlich. Normalisieren Sie die Ausgabe, um Konsistenz in Ihrem Korpus zu gewährleisten:
import re
def normalize_markdown(markdown):
"""Markdown-Abstände bereinigen"""
# Entfernen mehrerer Leerzeilen
markdown = re.sub(r'\n{3,}', '\n\n', markdown)
# Entfernen führender Leerzeichen
markdown = '\n'.join(line.rstrip() for line in markdown.split('\n'))
# Sicherstellen eines einzelnen Zeilenumbruchs am Ende
markdown = markdown.rstrip() + '\n'
return markdown
3. Validieren der Ausgabe
Qualitätskontrolle ist entscheidend. Implementieren Sie Validierung, um Konvertierungsfehler frühzeitig zu erkennen:
def validate_markdown(markdown):
"""Validieren der Markdown-Qualität"""
issues = []
# Überprüfen auf HTML-Reste
if '<' in markdown and '>' in markdown:
issues.append("HTML-Tags erkannt")
# Überprüfen auf defekte Links
if '[' in markdown and ']()' in markdown:
issues.append("Leerer Link erkannt")
# Überprüfen auf übermäßige Code-Blöcke
code_block_count = markdown.count('```')
if code_block_count % 2 != 0:
issues.append("Nicht geschlossener Code-Block")
return len(issues) == 0, issues
4. Batch-Verarbeitungsvorlage
Bei der Verarbeitung großer Dokumentensammlungen verwenden Sie diese produktionsreife Vorlage mit korrekter 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):
"""Verarbeiten einer einzelnen HTML-Datei"""
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):
"""Konvertieren aller HTML-Dateien im Verzeichnis"""
html_files = list(Path(input_dir).rglob('*.html'))
logger.info(f"Es wurden {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"Erfolgreich konvertiert {success_count}/{len(html_files)} Dateien")
# Verwendung
batch_convert('./html_docs', max_workers=8)
Fazit
Das Python-Ökosystem bietet ausgereifte, produktionsreife Tools für die HTML-zu-Markdown-Konvertierung, die jeweils für unterschiedliche Szenarien optimiert sind. Ihre Wahl sollte mit Ihren spezifischen Anforderungen übereinstimmen:
- Schnelle Konvertierungen: Verwenden Sie
html2textfür seine Einfachheit und fehlenden Abhängigkeiten - Benutzerdefinierte Logik: Verwenden Sie
markdownifyfür maximale Flexibilität durch Subclassing - Web-Scraping: Verwenden Sie
trafilaturafür die intelligente Inhaltsextraktion mit Boilerplate-Entfernung - Massenumzüge: Verwenden Sie
html2mdfür asynchrone Leistung bei groß angelegten Projekten - Produktionssysteme: Verwenden Sie
html-to-markdownfür Typsicherheit und umfassende HTML5-Unterstützung - Semantische Erhaltung: Verwenden Sie
domscribezur Beibehaltung der HTML5-Semantikstruktur
Empfehlungen für LLM-Workflows
Für LLM-Vorverarbeitungs-Workflows wird ein zweistufiger Ansatz empfohlen:
- Beginnen Sie mit
trafilaturafür die anfängliche Inhaltsextraktion – es entfernt intelligent Navigation, Anzeigen und Boilerplate, während der Hauptinhalt erhalten bleibt - Greifen Sie auf
html-to-markdownzurück für komplexe Dokumente, die eine präzise Strukturbeibehaltung erfordern, wie z.B. technische Dokumentation mit Tabellen und Code-Blöcken
Diese Kombination deckt 95% der realen Szenarien effektiv ab.
Nächste Schritte
Alle diese Tools (mit Ausnahme von html2text) werden aktiv gepflegt und sind produktionsreif. Es ist besser:
- Installieren Sie 2-3 Bibliotheken, die zu Ihrem Anwendungsfall passen
- Testen Sie sie mit Ihren tatsächlichen HTML-Beispielen
- Vergleichen Sie die Leistung mit Ihren typischen Dokumentgrößen
- Wählen Sie basierend auf der Ausgabequalität, nicht nur auf der Geschwindigkeit
Das Python-Ökosystem für die HTML-zu-Markdown-Konvertierung hat sich erheblich weiterentwickelt, und Sie können mit keiner dieser Wahlmöglichkeiten für ihre beabsichtigten Anwendungsfälle falsch liegen.
Zusätzliche Ressourcen
- html2text Dokumentation
- markdownify auf PyPI
- html-to-markdown GitHub
- trafilatura Dokumentation
- html2md Dokumentation
- domscribe auf PyPI
Hinweis: Dieser Vergleich basiert auf der Analyse der offiziellen Dokumentation, Community-Feedback und Bibliotheksarchitektur. Die Leistungscharakteristika sind repräsentativ für typische Nutzungsmuster. Für spezifische Anwendungsfälle führen Sie Ihre eigenen Benchmarks mit Ihren tatsächlichen HTML-Beispielen durch.
Andere nützliche Artikel
- Markdown Cheatsheet
- Verwendung von Markdown Code-Blöcken
- Konvertieren von Word-Dokumenten in Markdown: Ein vollständiger Leitfaden
- Konvertieren von HTML-Inhalten in Markdown mit LLM und Ollama
- cURL Cheatsheet
- Hugo Static Site Generator Cheatsheet
- Hinzufügen von strukturierten Datenmarkierungen zu Hugo
- Dokuwiki - selbstgehostetes Wiki und die Alternativen
- Verwendung von Obsidian für das persönliche Wissensmanagement