C++ में HTML पार्सिंग: Gumbo, MyHTML और htmlcxx लाइब्रेरी की समीक्षा

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में HTML पार्सिंग: सर्वश्रेष्ठ लाइब्रेरीज़ की समीक्षा

HTML दस्तावेज़ों को पार्स करना पार्सर, वेब स्क्रैपर और डेटा विश्लेषण टूल बनाने में एक महत्वपूर्ण कार्य है। हालाँकि C++ इस क्षेत्र में Python या JavaScript जितना लोकप्रिय नहीं है, फिर भी इसमें कई शक्तिशाली और उच्च-प्रदर्शन वाली लाइब्रेरीज़ मौजूद हैं। इस लेख में हम तीन सबसे परिपक्व समाधानों पर चर्चा करेंगे: Google का Gumbo-parser, MyHTML और htmlcxx। हम इनके API, विशेषताओं और व्यावहारिक कोड उदाहरणों को समझेंगे।

1. Gumbo-parser (Google)

Gumbo Google इंजीनियरों द्वारा विकसित HTML5 पार्सिंग लाइब्रेरी है। यह WHATWG HTML5 स्पेसिफिकेशन का पूरी तरह से पालन करती है और "गंदे" HTML कोड को भी संभालने में माहिर है। मुख्य लाभ:

  • बिना किसी बाहरी डिपेंडेंसी के शुद्ध C API।
  • SVG और MathML सहित सभी HTML5 एलिमेंट्स का समर्थन।
  • सही नेस्टिंग के साथ पूर्ण DOM ट्री लौटाता है।
  • तेज़ गति (बेंचमार्क में 50 MB/s तक)।

Gumbo-parser का उपयोग उदाहरण

इस उदाहरण में हम HTML दस्तावेज़ से सभी लिंक (<a>) निकालेंगे:

#include <iostream>
#include <string>
#include "gumbo.h"

void extract_links(GumboNode* node) {
    if (node->type != GUMBO_NODE_ELEMENT) return;

    GumboAttribute* href = nullptr;
    if (node->v.element.tag == GUMBO_TAG_A) {
        href = gumbo_get_attribute(&node->v.element.attributes, "href");
        if (href) {
            std::cout << "लिंक मिला: " << href->value << std::endl;
        }
    }

    // चाइल्ड एलिमेंट्स की रिकर्सिव ट्रैवर्सल
    const GumboVector* children = &node->v.element.children;
    for (unsigned int i = 0; i < children->length; ++i) {
        extract_links(static_cast<GumboNode*>(children->data[i]));
    }
}

int main() {
    std::string html = "<html><body><a href='https://example.com'>उदाहरण</a></body></html>";
    GumboOutput* output = gumbo_parse(html.c_str());
    extract_links(output->root);
    gumbo_destroy_output(&kGumboDefaultOptions, output);
    return 0;
}

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

2. MyHTML — तेज़ और हल्का पार्सर

MyHTML C में लिखी गई एक लाइब्रेरी है जो अधिकतम प्रदर्शन पर केंद्रित है। यह पूर्ण DOM ट्री नहीं बनाती, बल्कि SAX-जैसा दृष्टिकोण (टोकन का अनुक्रमिक प्रसंस्करण) अपनाती है। यह उन कार्यों के लिए आदर्श है जहाँ जटिल पदानुक्रम बनाए बिना तेज़ी से डेटा निकालना होता है।

MyHTML की मुख्य विशेषताएँ

  • मॉड्यूलर आर्किटेक्चर: पार्सर + सीरियलाइज़र + स्ट्रीमिंग API।
  • एन्कोडिंग सपोर्ट (UTF-8, Windows-1251, KOI8-R और अन्य)।
  • HTML फ़्रैगमेंट के साथ काम करने की क्षमता (बिना अनिवार्य <html> टैग के)।
  • कम मेमोरी खपत — पूरा ट्री स्टोर नहीं करता।

उदाहरण: "content" क्लास वाले सभी <div> टैग गिनना

#include <iostream>
#include "myhtml/api.h"

int main() {
    // पार्सर इनिशियलाइज़ेशन
    myhtml_t* myhtml = myhtml_create();
    myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0);

    // HTML पार्सिंग
    const char* html = "<div class='content'>ब्लॉक 1</div><div>ब्लॉक 2</div>";
    myhtml_tree_t* tree = myhtml_tree_create();
    myhtml_tree_init(tree, myhtml);
    myhtml_parse(tree, MyENCODING_UTF_8, html, strlen(html));

    // CSS सेलेक्टर से एलिमेंट खोजें
    myhtml_collection_t* collection = myhtml_collection_create(1, 1);
    myhtml_css_match_selector(tree, tree->node, "div.content", collection, NULL);

    std::cout << "एलिमेंट मिले: " << collection->length << std::endl;

    // मेमोरी साफ़ करें
    myhtml_collection_destroy(collection);
    myhtml_tree_destroy(tree);
    myhtml_destroy(myhtml);
    return 0;
}

MyHTML का CSS सेलेक्टर सपोर्ट इसे डेटा निकालने के लिए बहुत सुविधाजनक बनाता है, खासकर जब आपको केवल विशिष्ट एलिमेंट चाहिए।

3. htmlcxx — C++ के लिए पारंपरिक समाधान

htmlcxx एक पुरानी लेकिन स्थिर C++ लाइब्रेरी है जो HTML और CSS पार्सिंग प्रदान करती है। यह DOM-आधारित दृष्टिकोण का उपयोग करती है और इसे STL (Standard Template Library) के साथ एकीकृत किया गया है।

htmlcxx की विशेषताएँ

  • C++ STL कंटेनरों (जैसे std::string, std::vector) के साथ मूल समर्थन।
  • CSS सेलेक्टर का उपयोग करके एलिमेंट खोजने की क्षमता।
  • सरल और सीधा API — शुरुआती लोगों के लिए आदर्श।
  • सक्रिय रूप से रखरखाव नहीं किया जाता, लेकिन अभी भी काम करता है।

उदाहरण: सभी पैराग्राफ टैग से टेक्स्ट निकालना

#include <iostream>
#include <string>
#include "htmlcxx/html/ParserDom.h"

int main() {
    std::string html = "<p>पहला पैराग्राफ</p><p>दूसरा पैराग्राफ</p>";
    
    // पार्सर बनाएँ
    htmlcxx::HTML::ParserDom parser;
    tree<htmlcxx::HTML::Node> dom = parser.parseTree(html);
    
    // सभी <p> टैग खोजें
    tree<htmlcxx::HTML::Node>::iterator it = dom.begin();
    tree<htmlcxx::HTML::Node>::iterator end = dom.end();
    
    for (; it != end; ++it) {
        if (it->tagName() == "p") {
            std::cout << "टेक्स्ट: " << it->text() << std::endl;
        }
    }
    
    return 0;
}

htmlcxx का सिंटैक्स C++ डेवलपर्स के लिए बहुत परिचित है, जो STL के साथ इसके गहरे एकीकरण के कारण है।

निष्कर्ष: कौन सी लाइब्रेरी चुनें?

तीनों लाइब्रेरीज़ की अपनी ताकत है:

  • Gumbo-parser — सबसे मानक-अनुरूप और मजबूत। जटिल HTML5 दस्तावेज़ों और पूर्ण DOM ट्री की आवश्यकता वाली परियोजनाओं के लिए सर्वश्रेष्ठ।
  • MyHTML — सबसे तेज़ और मेमोरी-कुशल। बड़े पैमाने पर वेब स्क्रैपिंग और स्ट्रीमिंग डेटा प्रोसेसिंग के लिए आदर्श।
  • htmlcxx — सरल और C++-अनुकूल। छोटी परियोजनाओं और शुरुआती लोगों के लिए उपयुक्त।

यदि आप प्रदर्शन और मानक अनुपालन चाहते हैं, तो Gumbo-parser चुनें। यदि गति और कम मेमोरी खपत प्राथमिकता है, तो MyHTML का उपयोग करें। और यदि आप एक सरल, STL-एकीकृत समाधान चाहते हैं, तो htmlcxx आपके लिए है।

अनुशंसाएँ