पाइथन के साथ HTML को मार्कडाउन में बदलना: एक व्यापक मार्गदर्शिका

एचटीएमएल को साफ़ और एलएलएम-तैयार मार्कडाउन में बदलने के लिए पाइथन

Page content

HTML को Markdown में बदलना आधुनिक विकास कार्यप्रवाहों में एक मूलभूत कार्य है, विशेष रूप से जब वेब सामग्री को बड़े भाषा मॉडल (LLMs), दस्तावेज़ीकरण प्रणालियों, या स्टैटिक साइट जनरेटर जैसे ह्यूगो के लिए तैयार किया जाता है।

जबकि HTML वेब ब्राउज़र के लिए समृद्ध स्टाइलिंग और संरचना के साथ डिज़ाइन किया गया है, मार्कडाउन एक साफ़, पढ़ने योग्य प्रारूप प्रदान करता है जो टेक्स्ट प्रोसेसिंग, वर्जन नियंत्रण, और AI उपभोग के लिए आदर्श है। अगर आप मार्कडाउन सिंटैक्स के साथ नए हैं, तो हमारे मार्कडाउन चीटशीट के लिए देखें, जो एक व्यापक संदर्भ प्रदान करता है।

इन्फोग्राफिक: HTML पेज को मार्कडाउन में बदलना

इस व्यापक समीक्षा में, हम छह पाइथन पैकेजों का पता लगाएंगे जो HTML से मार्कडाउन में परिवर्तन करते हैं, व्यावहारिक कोड उदाहरणों, प्रदर्शन बेंचमार्क, और वास्तविक दुनिया के उपयोग मामलों के साथ। चाहे आप एक LLM ट्रेनिंग पाइपलाइन बन रहे हों, एक ब्लॉग को ह्यूगो में माइग्रेट कर रहे हों, या दस्तावेज़ीकरण स्क्रैप कर रहे हों, आप अपने कार्यप्रवाह के लिए सही उपकरण पाएंगे।

वैकल्पिक दृष्टिकोण: अगर आपको सेमांटिक समझ के साथ अधिक बुद्धिमान सामग्री निकालने की आवश्यकता है, तो आप LLM और Ollama का उपयोग करके HTML को मार्कडाउन में बदलना भी विचार कर सकते हैं, जो जटिल लेआउट के लिए AI-सक्षम परिवर्तन प्रदान करता है।

आप क्या सीखेंगे:

  • छह लाइब्रेरीज की विस्तृत तुलना, प्रत्येक के लिए फायदे और नुकसान
  • वास्तविक दुनिया के HTML नमूनों के साथ प्रदर्शन बेंचमार्क
  • सामान्य उपयोग मामलों के लिए उत्पादन-तैयार कोड उदाहरण
  • LLM प्रीप्रोसेसिंग कार्यप्रवाहों के लिए सर्वोत्तम प्रथाएं
  • अपने आवश्यकताओं के आधार पर विशिष्ट सिफारिशें

LLM प्रीप्रोसेसिंग के लिए मार्कडाउन क्यों?

उपकरणों में गहराई से उतरने से पहले, हम समझें कि मार्कडाउन LLM कार्यप्रवाहों के लिए विशेष रूप से क्यों मूल्यवान है:

  1. टोकन दक्षता: मार्कडाउन उसी सामग्री के लिए HTML से काफी कम टोकन का उपयोग करता है
  2. सेमांटिक स्पष्टता: मार्कडाउन वर्बोज़ टैग्स के बिना दस्तावेज़ संरचना को संरक्षित करता है
  3. पठन क्षमता: मानव और LLM दोनों मार्कडाउन के सिंटैक्स को आसानी से पार्स कर सकते हैं
  4. संगतता: मानकीकृत प्रारूप मॉडल इनपुट में अस्पष्टता को कम करता है
  5. संग्रह: ट्रेनिंग डेटा और कॉन्टेक्स्ट विंडोज के लिए छोटे फ़ाइल साइज़

मार्कडाउन की बहुमुखी प्रतिभा HTML परिवर्तन से परे फैली हुई है—आप वर्ड दस्तावेज़ों को मार्कडाउन में बदलना दस्तावेज़ीकरण कार्यप्रवाहों के लिए कर सकते हैं, या इसे ज्ञान प्रबंधन प्रणालियों जैसे व्यक्तिगत ज्ञान प्रबंधन के लिए ओब्सिडियन में उपयोग कर सकते हैं।

TL;DR - तेज़ तुलना मैट्रिक्स

अगर आप जल्दबाजी में हैं, तो यहां सभी छह लाइब्रेरीज की एक नज़र में व्यापक तुलना है। यह तालिका आपको तेज़ी से पहचानने में मदद करेगी कि कौन सा उपकरण आपके विशिष्ट आवश्यकताओं के साथ मेल खाता है:

विशेषता html2text markdownify html-to-markdown trafilatura domscribe html2md
HTML5 समर्थन आंशिक आंशिक पूर्ण पूर्ण पूर्ण पूर्ण
टाइप हिंट्स नहीं नहीं हाँ आंशिक नहीं आंशिक
कस्टम हैंडलर्स सीमित उत्कृष्ट अच्छा सीमित अच्छा सीमित
टेबल समर्थन बुनियादी बुनियादी उन्नत अच्छा अच्छा अच्छा
एसिंक्रोनस समर्थन नहीं नहीं नहीं नहीं नहीं हाँ
सामग्री निकालना नहीं नहीं नहीं उत्कृष्ट नहीं अच्छा
मेटाडेटा निकालना नहीं नहीं हाँ उत्कृष्ट नहीं हाँ
CLI टूल नहीं नहीं हाँ हाँ नहीं हाँ
गति मध्यम धीमा तेज़ बहुत तेज़ मध्यम बहुत तेज़
सक्रिय विकास नहीं हाँ हाँ हाँ सीमित हाँ
पाइथन संस्करण 3.6+ 3.7+ 3.9+ 3.6+ 3.8+ 3.10+
निर्भरताएं कोई नहीं BS4 lxml lxml BS4 aiohttp

तेज़ चयन मार्गदर्शिका:

  • गति की आवश्यकता है? → trafilatura या html2md
  • कस्टमाइजेशन की आवश्यकता है? → markdownify
  • टाइप सुरक्षा की आवश्यकता है? → html-to-markdown
  • सादगी की आवश्यकता है? → html2text
  • सामग्री निकालने की आवश्यकता है? → trafilatura

प्रतियोगी: 6 पाइथन पैकेज तुलना

हमें प्रत्येक लाइब्रेरी के साथ व्यावहारिक कोड उदाहरणों, कॉन्फ़िगरेशन विकल्पों, और वास्तविक दुनिया के अंतर्दृष्टियों के साथ गहराई से उतरना चाहिए। प्रत्येक अनुभाग में इंस्टॉलेशन निर्देश, उपयोग पैटर्न, और ताकतों और सीमाओं के ईमानदार आकलन शामिल हैं।

1. html2text - क्लासिक चॉइस

आरोन स्वार्ट्ज द्वारा विकसित, html2text पाइथन पारिस्थितिकी में एक दशक से अधिक समय से एक स्थूल है। यह साफ़, पढ़ने योग्य मार्कडाउन आउटपुट उत्पन्न करने पर ध्यान केंद्रित करता है।

इंस्टॉलेशन:

pip install html2text

बुनियादी उपयोग:

import html2text

# कन्वर्टर इंस्टेंस बनाएं
h = html2text.HTML2Text()

# विकल्प कॉन्फ़िगर करें
h.ignore_links = False
h.ignore_images = False
h.ignore_emphasis = False
h.body_width = 0  # पंक्तियों को नहीं लपेटें

html_content = """
<h1>वेब स्क्रैपिंग में आपका स्वागत है</h1>
<p>यह सामग्री निकालने का एक **विस्तृत मार्गदर्शिका** है।</p>
<ul>
    <li>आसान उपयोग</li>
    <li>बैटल-टेस्टेड</li>
    <li>वैद्युत रूप से अपनाया गया</li>
</ul>
<a href="https://example.com">अधिक जानें</a>
"""

markdown = h.handle(html_content)
print(markdown)

आउटपुट:

# वेब स्क्रैपिंग में आपका स्वागत है

यह सामग्री निकालने का एक **विस्तृत मार्गदर्शिका** है।

  * आसान उपयोग
  * बैटल-टेस्टेड
  * वैद्युत रूप से अपनाया गया

[अधिक जानें](https://example.com)

उन्नत कॉन्फ़िगरेशन:

import html2text

h = html2text.HTML2Text()

# विशिष्ट तत्वों को छोड़ें
h.ignore_links = True
h.ignore_images = True

# फॉर्मेटिंग को नियंत्रित करें
h.body_width = 80  # 80 अक्षरों पर लपेटें
h.unicode_snob = True  # यूनिकोड अक्षरों का उपयोग करें
h.emphasis_mark = '*'  # _ के बजाय * का उपयोग करें जोर के लिए
h.strong_mark = '**'

# टेबल्स का सामना करें
h.ignore_tables = False

# प्री-फॉर्मेटेड टेक्स्ट की रक्षा करें
h.protect_links = True

फायदे:

  • परिपक्व और स्थिर (15+ वर्षों का विकास)
  • व्यापक कॉन्फ़िगरेशन विकल्प
  • एज केस को अच्छी तरह से संभालता है
  • कोई बाहरी निर्भरताएं नहीं

नुकसान:

  • सीमित HTML5 समर्थन
  • असंगत स्पेसिंग उत्पन्न कर सकता है
  • सक्रिय रूप से नहीं बनाए रखा जाता है (अंतिम प्रमुख अपडेट 2020 में)
  • केवल एकल-थ्रेडेड प्रोसेसिंग

सबसे अच्छा है: सरल HTML दस्तावेज़ों के लिए, पुराने प्रणालियों के लिए, जब स्थिरता सबसे महत्वपूर्ण हो


2. markdownify - फ्लेक्सिबल ऑप्शन

markdownify BeautifulSoup4 का उपयोग करता है ताकि लचीला HTML पार्सिंग प्रदान किया जा सके जिसमें कस्टमाइजेबल टैग हैंडलिंग हो।

इंस्टॉलेशन:

pip install markdownify

बुनियादी उपयोग:

from markdownify import markdownify as md

html = """
<article>
    <h2>आधुनिक वेब विकास</h2>
    <p>बनाना <code>Python</code> और <em>आधुनिक फ्रेमवर्क</em> के साथ।</p>
    <blockquote>
        <p>सादगी अंतिम परिपक्वता है।</p>
    </blockquote>
</article>
"""

markdown = md(html)
print(markdown)

आउटपुट:

आधुनिक वेब विकास

Python और आधुनिक फ्रेमवर्क्स के साथ निर्माण करना।

सरलता ही अंतिम शिष्टता है।

उन्नत उपयोग साथ ही कस्टम हैंडलर्स:

from markdownify import MarkdownConverter

class CustomConverter(MarkdownConverter):
    """
    विशिष्ट टैग हैंडलिंग के साथ कस्टम कन्वर्टर बनाना
    """
    def convert_img(self, el, text, convert_as_inline):
        """अल्ट टेक्स्ट के साथ कस्टम इमेज हैंडलर"""
        alt = el.get('alt', '')
        src = el.get('src', '')
        title = el.get('title', '')

        if title:
            return f'![{alt}]({src} "{title}")'
        return f'![{alt}]({src})'

    def convert_pre(self, el, text, convert_as_inline):
        """भाषा पता लगाने के साथ बढ़ी हुई कोड ब्लॉक हैंडलिंग"""
        code = el.find('code')
        if code:
            # क्लास एट्रिब्यूट से भाषा निकालना (उदाहरण के लिए, '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'

# कस्टम कन्वर्टर का उपयोग करना
html = '<pre><code class="language-python">def hello():\n    print("world")</code></pre>'
markdown = CustomConverter().convert(html)
print(markdown)

Markdown कोड ब्लॉक्स और सिंटैक्स हाइलाइटिंग के साथ काम करने के बारे में अधिक विवरण के लिए, हमारी गाइड देखें Markdown कोड ब्लॉक्स का उपयोग करना

चयनात्मक टैग कन्वर्जन:

from markdownify import markdownify as md

# कुछ टैग को पूरी तरह से हटाना
markdown = md(html, strip=['script', 'style', 'nav'])

# केवल कुछ टैग को कन्वर्ट करना
markdown = md(
    html,
    heading_style="ATX",  # हेडिंग्स के लिए # का उपयोग करना
    bullets="-",  # बुलेट्स के लिए - का उपयोग करना
    strong_em_symbol="*",  # जोर के लिए * का उपयोग करना
)

लाभ:

  • BeautifulSoup4 पर बनाया गया (मजबूत HTML पार्सिंग)
  • सबक्लासिंग के माध्यम से अत्यधिक अनुकूलनीय
  • सक्रिय रखरखाव
  • अच्छा दस्तावेज़ीकरण

हानियाँ:

  • BeautifulSoup4 निर्भरता की आवश्यकता होती है
  • बड़े दस्तावेज़ों के लिए धीमा हो सकता है
  • सीमित बिल्ट-इन टेबल समर्थन

सबसे अच्छा उपयोग: कस्टम कन्वर्जन लॉजिक, BeautifulSoup4 का उपयोग करने वाले प्रोजेक्ट्स


3. html-to-markdown - आधुनिक पावरहाउस

html-to-markdown एक पूर्ण रूप से टाइप्ड, आधुनिक लाइब्रेरी है जिसमें व्यापक HTML5 समर्थन और व्यापक कॉन्फ़िगरेशन विकल्प हैं।

इंस्टॉलेशन:

pip install html-to-markdown

बुनियादी उपयोग:

from html_to_markdown import convert

html = """
<article>
    <h1>तकनीकी दस्तावेज़ीकरण</h1>
    <table>
        <thead>
            <tr>
                <th>फीचर</th>
                <th>समर्थन</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>HTML5</td>
                <td>✓</td>
            </tr>
            <tr>
                <td>टेबल्स</td>
                <td>✓</td>
            </tr>
        </tbody>
    </table>
</article>
"""

markdown = convert(html)
print(markdown)

उन्नत कॉन्फ़िगरेशन:

from html_to_markdown import convert, Options

# कस्टम विकल्प बनाना
options = Options(
    heading_style="ATX",
    bullet_style="-",
    code_language_default="python",
    strip_tags=["script", "style"],
    escape_special_chars=True,
    table_style="pipe",  # टेबल्स के लिए | का उपयोग करना
    preserve_whitespace=False,
    extract_metadata=True,  # मेटा टैग्स निकालना
)

markdown = convert(html, options=options)

कमांड-लाइन इंटरफेस:

# एकल फाइल कन्वर्ट करना
html-to-markdown input.html -o output.md

# विकल्पों के साथ कन्वर्ट करना
html-to-markdown input.html \
    --heading-style atx \
    --strip-tags script,style \
    --extract-metadata

# बैच कन्वर्जन
find ./html_files -name "*.html" -exec html-to-markdown {} -o ./markdown_files/{}.md \;

लाभ:

  • पूर्ण HTML5 समर्थन जिसमें सेमांटिक तत्व शामिल हैं
  • टाइप-सेफ़ के साथ व्यापक टाइप हिंट्स
  • बढ़ी हुई टेबल हैंडलिंग (मर्ज्ड सेल्स, एलाइनमेंट)
  • मेटाडेटा एक्सट्रैक्शन क्षमताएं
  • सक्रिय विकास और आधुनिक कोडबेस

हानियाँ:

  • Python 3.9+ की आवश्यकता होती है
  • बड़ा निर्भरता फुटप्रिंट
  • सीखने की अधिक चढ़ाई

सबसे अच्छा उपयोग: जटिल HTML5 दस्तावेज़, टाइप-सेफ़ प्रोजेक्ट्स, उत्पादन सिस्टम


4. trafilatura - सामग्री एक्सट्रैक्शन विशेषज्ञ

trafilatura केवल एक HTML-to-Markdown कन्वर्टर नहीं है—यह एक बुद्धिमान सामग्री एक्सट्रैक्शन लाइब्रेरी है जो विशेष रूप से वेब स्क्रैपिंग और लेख एक्सट्रैक्शन के लिए डिज़ाइन की गई है।

इंस्टॉलेशन:

pip install trafilatura

बुनियादी उपयोग:

import trafilatura

# URL से डाउनलोड और एक्सट्रैक्ट करना
url = "https://example.com/article"
downloaded = trafilatura.fetch_url(url)
markdown = trafilatura.extract(downloaded, output_format='markdown')
print(markdown)

नोट: Trafilatura में बिल्ट-इन URL फेचिंग शामिल है, लेकिन अधिक जटिल HTTP ऑपरेशन्स के लिए, आप हमारे cURL चीटशीट का उपयोग करने पर विचार कर सकते हैं जब API या प्रमाणित एंडपॉइंट्स के साथ काम कर रहे हों।

उन्नत सामग्री एक्सट्रैक्शन:

import trafilatura
from trafilatura.settings import use_config

# कस्टम कॉन्फ़िगरेशन बनाना
config = use_config()
config.set("DEFAULT", "EXTRACTION_TIMEOUT", "30")

html = """
<html>
<head><title>Article Title</title></head>
<body>
    <nav>Navigation menu</nav>
    <article>
        <h1>Main Article</h1>
        <p>Important content here.</p>
    </article>
    <aside>Advertisement</aside>
    <footer>Footer content</footer>
</body>
</html>
"""

# केवल मुख्य सामग्री निकालना
markdown = trafilatura.extract(
    html,
    output_format='markdown',
    include_comments=False,
    include_tables=True,
    include_images=True,
    include_links=True,
    config=config
)

# मेटाडेटा के साथ निकालना
result = trafilatura.extract(
    html,
    output_format='markdown',
    with_metadata=True
)

if result:
    print(f"Title: {result.get('title', 'N/A')}")
    print(f"Author: {result.get('author', 'N/A')}")
    print(f"Date: {result.get('date', 'N/A')}")
    print(f"\nContent:\n{result.get('text', '')}")

बैच प्रोसेसिंग:

import trafilatura
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path

def process_url(url):
    """URL से मार्कडाउन निकालना"""
    downloaded = trafilatura.fetch_url(url)
    if downloaded:
        return trafilatura.extract(
            downloaded,
            output_format='markdown',
            include_links=True,
            include_images=True
        )
    return None

# कई URL को समानांतर में प्रोसेस करना
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')

लाभ:

  • बुद्धिमान सामग्री एक्सट्रैक्शन (बॉयलरप्लेट हटाता है)
  • रॉबस्ट एरर हैंडलिंग के साथ बिल्ट-इन URL फेचिंग
  • मेटाडेटा एक्सट्रैक्शन (शीर्षक, लेखक, तिथि)
  • भाषा पता लगाना
  • समाचार लेखों और ब्लॉग पोस्ट्स के लिए अनुकूलित
  • तेज़ C-आधारित पार्सिंग

हानियाँ:

  • सामान्य HTML के लिए बहुत अधिक सामग्री हटा सकता है
  • लेख एक्सट्रैक्शन पर केंद्रित (सामान्य उद्देश्य नहीं)
  • एज केस के लिए कॉन्फ़िगरेशन जटिलता

सबसे अच्छा उपयोग: वेब स्क्रैपिंग, लेख एक्सट्रैक्शन, LLM ट्रेनिंग डेटा तैयारी


5. domscribe - सेमांटिक संरक्षणवादी

domscribe HTML से Markdown में कन्वर्ट करते समय HTML5 के सेमांटिक अर्थ को संरक्षित करने पर ध्यान केंद्रित करता है।

इंस्टॉलेशन:

pip install domscribe

बुनियादी उपयोग:

from domscribe import html_to_markdown

html = """
<article>
    <header>
        <h1>सेमांटिक HTML को समझना</h1>
        <time datetime="2024-10-24">24 अक्टूबर, 2024</time>
    </header>
    <section>
        <h2>परिचय</h2>
        <p>सेमांटिक HTML सामग्री को <mark>अर्थ</mark> प्रदान करता है।</p>
    </section>
    <aside>
        <h3>संबंधित विषय</h3>
        <ul>
            <li>सुलभता</li>
            <li>SEO</li>
        </ul>
    </aside>
</article>
"""

markdown = html_to_markdown(html)
print(markdown)

कस्टम विकल्प:

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)

लाभ:

  • HTML5 सेमांटिक संरचना संरक्षित करता है
  • आधुनिक वेब घटकों को अच्छी तरह से हैंडल करता है
  • साफ़ API डिज़ाइन

हानियाँ:

  • अभी भी प्रारंभिक विकास में है (API बदल सकता है)
  • परिपक्व विकल्पों की तुलना में सीमित दस्तावेज़ीकरण
  • छोटा समुदाय और कम उदाहरण उपलब्ध हैं

सबसे अच्छा उपयोग: सेमांटिक HTML5 दस्तावेज़, सुलभता-उन्मुख प्रोजेक्ट्स, जब HTML5 सेमांटिक संरचना संरक्षण महत्वपूर्ण हो

नोट: जबकि domscribe नया है और कम परीक्षण किया गया है, यह एक विशिष्ट निचे को भरता है जिसे अन्य उपकरण प्राथमिकता नहीं देते हैं।


6. html2md - एसिंक्रोनस पावरहाउस

html2md उच्च प्रदर्शन बैच कन्वर्जन के लिए डिज़ाइन किया गया है जिसमें एसिंक्रोनस प्रोसेसिंग है।

इंस्टॉलेशन:

pip install html2md

कमांड-लाइन उपयोग:

# पूरे डायरेक्टरी कन्वर्ट करना
m1f-html2md convert ./website -o ./docs

# कस्टम सेटिंग्स के साथ
m1f-html2md convert ./website -o ./docs \
    --remove-tags nav,footer \
    --heading-offset 1 \
    --detect-language

# एकल फाइल कन्वर्ट करना
m1f-html2md convert index.html -o readme.md

प्रोग्रामेटिक उपयोग:

import asyncio
from html2md import convert_html

async def convert_files():
    """एसिंक्रोनस बैच कन्वर्जन"""
    html_files = [
        'page1.html',
        'page2.html',
        'page3.html'
    ]

    tasks = [convert_html(file) for file in html_files]
    results = await asyncio.gather(*tasks)
    return results

# कन्वर्जन चलाना
results = asyncio.run(convert_files())

लाभ:

  • उच्च प्रदर्शन के लिए एसिंक्रोनस प्रोसेसिंग
  • बुद्धिमान सामग्री सेलेक्टर पता लगाना
  • YAML फ्रंटमैटर जनरेशन (हुगो के लिए महान!)
  • कोड भाषा पता लगाना
  • समानांतर प्रोसेसिंग समर्थन

हानियाँ:

  • Python 3.10+ की आवश्यकता होती है
  • CLI-उन्मुख (कम लचीलापन वाला API)
  • दस्तावेज़ीकरण अधिक व्यापक हो सकता है

सबसे अच्छा उपयोग: बड़े पैमाने पर माइग्रेशन, बैच कन्वर्जन, हुगो/जेकिल माइग्रेशन

प्रदर्शन बेंचमार्किंग

प्रदर्शन महत्वपूर्ण है, विशेष रूप से जब हजारों दस्तावेज़ों को LLM प्रशिक्षण या बड़े पैमाने पर माइग्रेशन के लिए प्रोसेस करने की बात आती है। लाइब्रेरीज के बीच सापेक्ष गति अंतरों को समझना आपको अपने वर्कफ्लो के लिए सूचित निर्णय लेने में मदद करता है।

तुलनात्मक प्रदर्शन विश्लेषण:

आम उपयोग पैटर्न के आधार पर, यहाँ तीन वास्तविक सीनारियो में ये लाइब्रेरीज कैसे तुलना करते हैं:

  1. साधारण HTML: टेक्स्ट, हेडर और लिंक्स वाले बेसिक ब्लॉग पोस्ट (5KB)
  2. जटिल HTML: नेटेड टेबल्स और कोड ब्लॉक्स वाले तकनीकी दस्तावेज़ (50KB)
  3. वास्तविक वेबसाइट: नेविगेशन, फुटर, साइडबार और विज्ञापनों सहित पूर्ण वेबपेज (200KB)

यहाँ एक उदाहरण बेंचमार्क कोड है जिसे आप स्वयं इन लाइब्रेरीज को टेस्ट करने के लिए उपयोग कर सकते हैं:

import time
import html2text
from markdownify import markdownify
from html_to_markdown import convert
import trafilatura

def benchmark(html_content, iterations=100):
    """बेंचमार्क कन्वर्जन स्पीड"""

    # 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
    }

आम प्रदर्शन विशेषताएं (प्रतिनिधित्वात्मक सापेक्ष गति):

पैकेज साधारण (5KB) जटिल (50KB) वास्तविक साइट (200KB)
html2text मध्यम धीमा धीमा
markdownify धीमा धीमा सबसे धीमा
html-to-markdown तेज तेज तेज
trafilatura तेज बहुत तेज बहुत तेज
html2md (async) बहुत तेज बहुत तेज सबसे तेज

मुख्य निरीक्षण:

  • html2md और trafilatura जटिल दस्तावेज़ों के लिए सबसे तेज हैं, जिससे वे बैच प्रोसेसिंग के लिए आदर्श बन जाते हैं
  • html-to-markdown उत्पादन उपयोग के लिए स्पीड और फीचर्स के बीच सबसे अच्छा संतुलन प्रदान करता है
  • markdownify धीमा है लेकिन सबसे लचीला—जब आपको कस्टम हैंडलर्स की आवश्यकता होती है तो यह ट्रेड-ऑफ का मूल्य है
  • html2text अपने पुराने होने के साथ धीमी प्रदर्शन दिखाता है, लेकिन साधारण उपयोग के लिए स्थिर रहता है

नोट: प्रदर्शन अंतर केवल हजारों या लाखों फाइलों को प्रोसेस करने पर महत्वपूर्ण हो जाते हैं। अवसरिक कन्वर्जन के लिए, कोई भी लाइब्रेरी काम करेगी। फीचर्स और कस्टमाइजेशन विकल्पों पर ध्यान केंद्रित करें।


वास्तविक दुनिया के उपयोग के मामले

थ्योरी मददगार है, लेकिन व्यावहारिक उदाहरणों से पता चलता है कि ये उपकरण उत्पादन में कैसे काम करते हैं। यहाँ चार आम सीनारियो हैं जिनमें पूर्ण, उत्पादन-तैयार कोड है जिसे आप अपने परियोजनाओं के लिए अनुकूलित कर सकते हैं।

उपयोग के मामला 1: LLM प्रशिक्षण डेटा तैयारी

आवश्यकता: हजारों दस्तावेज़ पृष्ठों से साफ टेक्स्ट निकालना

सिफारिश: trafilatura + पैरालेल प्रोसेसिंग

import trafilatura
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor

def process_html_file(html_path):
    """HTML फाइल को मार्कडाउन में कन्वर्ट करें"""
    html = Path(html_path).read_text(encoding='utf-8')
    markdown = trafilatura.extract(
        html,
        output_format='markdown',
        include_links=False,  # साफ प्रशिक्षण डेटा के लिए हटाएं
        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 फाइलों को पैरालेल में प्रोसेस करें
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"{len(html_files)} फाइलों को प्रोसेस किया गया")
print(f"कुल अक्षर: {sum(token_counts):,}")

उपयोग के मामला 2: ह्यूगो ब्लॉग माइग्रेशन

आवश्यकता: वर्डप्रेस ब्लॉग को ह्यूगो में माइग्रेट करें जिसमें फ्रंटमैटर शामिल है

सिफारिश: html2md CLI

ह्यूगो एक लोकप्रिय स्टैटिक साइट जनरेटर है जो सामग्री के लिए मार्कडाउन का उपयोग करता है। अधिक ह्यूगो-विशिष्ट टिप्स के लिए, हमारी ह्यूगो चीतशीट देखें और ह्यूगो वेबसाइट में संरचित डेटा मार्कअप जोड़ना के बारे में सीखें ताकि बेहतर SEO हो।

# सभी पोस्ट्स को फ्रंटमैटर के साथ कन्वर्ट करें
m1f-html2md convert ./wordpress-export \
    -o ./hugo/content/posts \
    --generate-frontmatter \
    --heading-offset 0 \
    --remove-tags script,style,nav,footer

या प्रोग्रामेटिक रूप से:

from html_to_markdown import convert, Options
from pathlib import Path
import yaml

def migrate_post(html_file):
    """वर्डप्रेस HTML को ह्यूगो मार्कडाउन में कन्वर्ट करें"""
    html = Path(html_file).read_text()

    # HTML से शीर्षक और तारीख निकालें
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'html.parser')
    title = soup.find('h1').get_text() if soup.find('h1') else 'Untitled'

    # मार्कडाउन में कन्वर्ट करें
    options = Options(strip_tags=['script', 'style', 'nav', 'footer'])
    markdown = convert(html, options=options)

    # ह्यूगो फ्रंटमैटर जोड़ें
    frontmatter = {
        'title': title,
        'date': '2024-10-24',
        'draft': False,
        'tags': []
    }

    output = f"---\n{yaml.dump(frontmatter)}---\n\n{markdown}"

    # सेव करें
    output_file = html_file.replace('.html', '.md')
    Path(output_file).write_text(output, encoding='utf-8')

# सभी पोस्ट्स प्रोसेस करें
for html_file in Path('./wordpress-export').glob('*.html'):
    migrate_post(html_file)

उपयोग के मामला 3: कस्टम फॉर्मेटिंग के साथ डॉक्यूमेंटेशन स्क्रेपर

आवश्यकता: कस्टम कोड ब्लॉक हैंडलिंग के साथ तकनीकी दस्तावेज़ स्क्रेप करें

सिफारिश: markdownify के साथ कस्टम कन्वर्टर

यह दृष्टिकोण विशेष रूप से विकी सिस्टम से दस्तावेज़ों को माइग्रेट करने के लिए उपयोगी है। अगर आप दस्तावेज़ों का प्रबंधन कर रहे हैं, तो आपको DokuWiki - सेल्फहोस्टेड विकी और विकल्प में रुचि हो सकती है जो सेल्फहोस्टेड दस्तावेज़ समाधान के लिए हैं।

from markdownify import MarkdownConverter
import requests

class DocsConverter(MarkdownConverter):
    """तकनीकी दस्तावेज़ के लिए कस्टम कन्वर्टर"""

    def convert_pre(self, el, text, convert_as_inline):
        """सिंटैक्स हाइलाइटिंग के साथ एन्हांस्ड कोड ब्लॉक"""
        code = el.find('code')
        if code:
            # क्लास से भाषा निकालें
            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):
        """विशेष दस्तावेज़ ब्लॉक्स हैंडल करें"""
        classes = el.get('class', [])

        # चेतावनी ब्लॉक्स
        if 'warning' in classes:
            return f'\n> ⚠️ **चेतावनी**: {text}\n'

        # जानकारी ब्लॉक्स
        if 'info' in classes or 'note' in classes:
            return f'\n> 💡 **नोट**: {text}\n'

        return text

def scrape_docs(url):
    """डॉक्यूमेंटेशन पेज स्क्रेप और कन्वर्ट करें"""
    response = requests.get(url)
    markdown = DocsConverter().convert(response.text)
    return markdown

# उपयोग करें
docs_url = "https://docs.example.com/api-reference"
markdown = scrape_docs(docs_url)
Path('api-reference.md').write_text(markdown)

उपयोग के मामला 4: न्यूज़लेटर को मार्कडाउन आर्काइव में कन्वर्ट करें

आवश्यकता: HTML ईमेल न्यूज़लेटर को पढ़ने योग्य मार्कडाउन में कन्वर्ट करें

सिफारिश: html2text के साथ विशेष कॉन्फ़िगरेशन

import html2text
import email
from pathlib import Path

def convert_newsletter(email_file):
    """HTML ईमेल को मार्कडाउन में कन्वर्ट करें"""
    # ईमेल पार्स करें
    with open(email_file, 'r') as f:
        msg = email.message_from_file(f)

    # HTML पार्ट प्राप्त करें
    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

    # कन्वर्टर कॉन्फ़िगर करें
    h = html2text.HTML2Text()
    h.ignore_images = False
    h.images_to_alt = True
    h.body_width = 0
    h.protect_links = True
    h.unicode_snob = True

    # कन्वर्ट करें
    markdown = h.handle(html_content)

    # मेटाडेटा जोड़ें
    subject = msg.get('Subject', 'No Subject')
    date = msg.get('Date', '')

    output = f"# {subject}\n\n*तारीख: {date}*\n\n---\n\n{markdown}"

    return output

# न्यूज़लेटर आर्काइव प्रोसेस करें
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')

सीनारियो के अनुसार सिफारिशें

अभी भी यह निर्धारित नहीं है कि किस लाइब्रेरी का चयन करना है? यहाँ विशिष्ट उपयोग के मामलों के आधार पर मेरा निर्णायक गाइड है। ये सिफारिशें प्रत्येक लाइब्रेरी के साथ उत्पादन वातावरण में हाथों-हाथ अनुभव से आती हैं।

वेब स्क्रेपिंग और LLM प्रीप्रोसेसिंग के लिए

विजेता: trafilatura

ट्राफिलाटुरा साफ सामग्री निकालने और बोइलरप्लेट हटाने में उत्कृष्ट है। आदर्श है:

  • LLM प्रशिक्षण डेटासेट बनाना
  • सामग्री एग्रीगेशन
  • शोध पत्र संग्रह
  • समाचार लेख निकालना

ह्यूगो/जेकिल माइग्रेशन के लिए

विजेता: html2md

एसिंक्रोनस प्रोसेसिंग और फ्रंटमैटर जनरेशन बैच माइग्रेशन को तेज और आसान बनाते हैं:

  • बैच कन्वर्जन
  • स्वचालित मेटाडेटा निकालना
  • YAML फ्रंटमैटर जनरेशन
  • हेडिंग स्तर समायोजन

कस्टम कन्वर्जन लॉजिक के लिए

विजेता: markdownify

कन्वर्टर को सबक्लास करें ताकि पूर्ण नियंत्रण प्राप्त हो:

  • कस्टम टैग हैंडलर्स
  • डोमेन-विशिष्ट कन्वर्जन
  • विशेष फॉर्मेटिंग आवश्यकताएं
  • मौजूदा BeautifulSoup कोड के साथ एकीकरण

टाइप-सेफ उत्पादन सिस्टम के लिए

विजेता: html-to-markdown

आधुनिक, टाइप-सेफ, और फीचर-कम्प्लीट:

  • पूर्ण HTML5 समर्थन
  • व्यापक टाइप हिंट्स
  • उन्नत टेबल हैंडलिंग
  • सक्रिय रखरखाव

साधारण, स्थिर कन्वर्जन के लिए

विजेता: html2text

जब आपको कुछ चाहिए जो “बस काम करता है”:

  • कोई निर्भरता नहीं
  • युद्ध-प्रमाणित
  • व्यापक कॉन्फ़िगरेशन
  • विस्तृत प्लेटफॉर्म समर्थन

LLM प्रीप्रोसेसिंग के लिए सर्वोत्तम प्रथाएँ

किसी भी लाइब्रेरी का चयन करने के बावजूद, इन सर्वोत्तम प्रथाओं का पालन करने से उच्च गुणवत्ता वाले मार्कडाउन आउटपुट प्राप्त होगा जो LLM उपभोग के लिए अनुकूलित है। ये पैटर्न लाखों दस्तावेजों को प्रोसेस करने वाले उत्पादन वर्कफ्लो में आवश्यक सिद्ध हुए हैं।

1. कन्वर्ट करने से पहले साफ करें

कन्वर्ट करने से पहले अनचाहे तत्वों को हटाने से साफ आउटपुट और बेहतर प्रदर्शन मिलता है:

from bs4 import BeautifulSoup
import trafilatura

def clean_and_convert(html):
    """कन्वर्ट करने से पहले अनचाहे तत्वों को हटाएं"""
    soup = BeautifulSoup(html, 'html.parser')

    # अनचाहे तत्वों को हटाएं
    for element in soup(['script', 'style', 'nav', 'footer', 'header', 'aside']):
        element.decompose()

    # विज्ञापन और ट्रैकिंग को हटाएं
    for element in soup.find_all(class_=['ad', 'advertisement', 'tracking']):
        element.decompose()

    # साफ HTML को कन्वर्ट करें
    markdown = trafilatura.extract(
        str(soup),
        output_format='markdown'
    )

    return markdown

2. व्हाइटस्पेस को सामान्यीकृत करें

विभिन्न कन्वर्टर व्हाइटस्पेस को अलग-अलग तरीके से हैंडल करते हैं। अपने कॉर्पस में समग्रता सुनिश्चित करने के लिए आउटपुट को सामान्यीकृत करें:

import re

def normalize_markdown(markdown):
    """मार्कडाउन स्पेसिंग को साफ करें"""
    # कई खाली पंक्तियों को हटाएं
    markdown = re.sub(r'\n{3,}', '\n\n', markdown)

    # अंतिम व्हाइटस्पेस को हटाएं
    markdown = '\n'.join(line.rstrip() for line in markdown.split('\n'))

    # अंत में एकल न्यूलाइन सुनिश्चित करें
    markdown = markdown.rstrip() + '\n'

    return markdown

3. आउटपुट को वैलिडेट करें

गुणवत्ता नियंत्रण आवश्यक है। कन्वर्जन त्रुटियों को जल्द पकड़ने के लिए वैलिडेशन लागू करें:

def validate_markdown(markdown):
    """मार्कडाउन गुणवत्ता का वैलिडेशन करें"""
    issues = []

    # HTML अवशेषों की जांच करें
    if '<' in markdown and '>' in markdown:
        issues.append("HTML टैग पाए गए")

    # टूटे हुए लिंक्स की जांच करें
    if '[' in markdown and ']()' in markdown:
        issues.append("खाली लिंक पाया गया")

    # अधिक कोड ब्लॉक्स की जांच करें
    code_block_count = markdown.count('```')
    if code_block_count % 2 != 0:
        issues.append("बंद नहीं हुआ कोड ब्लॉक")

    return len(issues) == 0, issues

4. बैच प्रोसेसिंग टेम्पलेट

बड़े दस्तावेज संग्रहों को प्रोसेस करने के लिए इस उत्पादन-तैयार टेम्पलेट का उपयोग करें जिसमें उचित त्रुटि हैंडलिंग, लॉगिंग, और पैरालेल प्रोसेसिंग:

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):
    """एकल HTML फाइल को प्रोसेस करें"""
    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:
            # सामान्यीकृत करें
            markdown = normalize_markdown(markdown)

            # वैलिडेट करें
            is_valid, issues = validate_markdown(markdown)
            if not is_valid:
                logger.warning(f"{html_path}: {', '.join(issues)}")

            # सेव करें
            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"Error processing {html_path}: {e}")
        return False

def batch_convert(input_dir, max_workers=4):
    """डायरेक्टरी में सभी HTML फाइलों को कन्वर्ट करें"""
    html_files = list(Path(input_dir).rglob('*.html'))
    logger.info(f"Found {len(html_files)} HTML files")

    with ProcessPoolExecutor(max_workers=max_workers) as executor:
        results = list(executor.map(process_file, html_files))

    success_count = sum(results)
    logger.info(f"Successfully converted {success_count}/{len(html_files)} files")

# Usage
batch_convert('./html_docs', max_workers=8)

निष्कर्ष

पाइथन इकोसिस्टम HTML-to-Markdown कन्वर्जन के लिए परिपक्व, उत्पादन-तैयार उपकरण प्रदान करता है, प्रत्येक विभिन्न स्थितियों के लिए अनुकूलित है। आपका चयन अपने विशिष्ट आवश्यकताओं के साथ मेल खाना चाहिए:

  • त्वरित कन्वर्जन: html2text का उपयोग अपने सरलता और शून्य निर्भरताओं के लिए करें
  • कस्टम लॉजिक: markdownify का उपयोग सबक्लासिंग के माध्यम से अधिकतम लचीलापन के लिए करें
  • वेब स्क्रैपिंग: trafilatura का उपयोग बॉयलरप्लेट हटाने के साथ बुद्धिमान सामग्री निकालने के लिए करें
  • बुल्क माइग्रेशन: html2md का उपयोग बड़े पैमाने पर परियोजनाओं पर एसिंक्रोनस प्रदर्शन के लिए करें
  • उत्पादन प्रणालियाँ: html-to-markdown का उपयोग टाइप सुरक्षा और व्यापक HTML5 समर्थन के लिए करें
  • सेमांटिक संरक्षण: domscribe का उपयोग HTML5 सेमांटिक संरचना बनाए रखने के लिए करें

LLM वर्कफ्लो के लिए सिफारिशें

LLM प्रीप्रोसेसिंग वर्कफ्लो के लिए दो-स्तरीय दृष्टिकोण की सिफारिश की जाती है:

  1. trafilatura के साथ शुरू करें प्रारंभिक सामग्री निकालने के लिए—यह बुद्धिमान रूप से नेविगेशन, विज्ञापन, और बॉयलरप्लेट को हटा देता है जबकि मुख्य सामग्री को संरक्षित करता है
  2. जटिल दस्तावेजों के लिए html-to-markdown पर वापस आ जाएं जिनमें टेबल और कोड ब्लॉक्स जैसे तकनीकी दस्तावेजों की सटीक संरचना बनाए रखने की आवश्यकता होती है

यह संयोजन 95% वास्तविक दुनिया के मामलों को प्रभावी ढंग से संभालता है।

अगले चरण

इनमें से सभी उपकरणों (सिवाय html2text) को सक्रिय रूप से बनाए रखा जाता है और उत्पादन-तैयार हैं। यह बेहतर है कि:

  1. अपने उपयोग के मामले के साथ मेल खाने वाले 2-3 लाइब्रेरी इंस्टॉल करें
  2. उन्हें अपने वास्तविक HTML नमूनों के साथ परीक्षण करें
  3. अपने सामान्य दस्तावेज़ आकारों के साथ प्रदर्शन बेंचमार्क करें
  4. आउटपुट गुणवत्ता के आधार पर चयन करें, केवल गति के आधार पर नहीं

HTML-to-Markdown कन्वर्जन के लिए पाइथन इकोसिस्टम काफी परिपक्व हो गया है, और आप अपने इरादे के मामलों के लिए इनमें से किसी भी चयन के साथ गलत नहीं हो सकते।

अतिरिक्त संसाधन

नोट: यह तुलना आधिकारिक दस्तावेज़ीकरण, समुदाय प्रतिक्रिया, और लाइब्रेरी आर्किटेक्चर के विश्लेषण पर आधारित है। प्रदर्शन विशेषताएँ सामान्य उपयोग पैटर्नों का प्रतिनिधित्व करती हैं। विशिष्ट उपयोग के मामलों के लिए, अपने वास्तविक HTML नमूनों के साथ अपने स्वयं के बेंचमार्क चलाएं।

अन्य उपयोगी लेख