C++ में HTML पार्सिंग: लाइब्रेरीज़ का अवलोकन और व्यावहारिक उदाहरण
C++ पर HTML पार्सिंग एक ऐसा कार्य है जिसका सामना डेवलपर्स वेब स्क्रैपर्स, सामग्री विश्लेषकों या डेटा निष्कर्षण उपकरण बनाते समय करते हैं। Python के विपरीत, जहाँ BeautifulSoup और lxml मानक हैं, C++ में कोई एक प्रमुख समाधान नहीं है। हालाँकि, कई परिपक्व और उच्च-प्रदर्शन वाली लाइब्रेरीज़ मौजूद हैं जो HTML दस्तावेज़ों के साथ कुशलतापूर्वक काम करने की अनुमति देती हैं।
इस लेख में, हम C++ पर HTML पार्सिंग के लिए तीन सबसे लोकप्रिय लाइब्रेरीज़ पर विचार करेंगे: Gumbo-parser (Google से), libxml2 (HTML मॉड्यूल के साथ) और MyHTML। हम कोड उदाहरण प्रस्तुत करेंगे, उनकी क्षमताओं की तुलना करेंगे और चयन के लिए सिफारिशें देंगे।
1. Gumbo-parser: Google से विश्वसनीयता
Gumbo-parser Google की एक लाइब्रेरी है जो WHATWG विनिर्देश के अनुसार HTML5 पार्सिंग को लागू करती है। यह शुद्ध C में लिखी गई है, जो इसे हल्का और तेज़ बनाती है। मुख्य लाभ:
- HTML5 का पूर्ण समर्थन (अमान्य दस्तावेज़ों सहित)
- न्यूनतम निर्भरताएँ
- DOM ट्री को पार करने के लिए सरल API
- उच्च प्रदर्शन
स्थापना:
git clone https://github.com/google/gumbo-parsercd gumbo-parser./autogen.sh./configuremakesudo make installHTML पार्सिंग और सभी लिंक निकालने का उदाहरण:
#include <gumbo.h>#include <iostream>#include <string>#include <vector>
void extract_links(GumboNode* node, std::vector<std::string>& links) { if (node->type != GUMBO_NODE_ELEMENT) return;
GumboAttribute* href; if (node->v.element.tag == GUMBO_TAG_A && (href = gumbo_get_attribute(&node->v.element.attributes, "href"))) { links.push_back(href->value); }
const GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_links(static_cast<GumboNode*>(children->data[i]), links); }}
int main() { const std::string html = R"(<html><body> <a href="https://pythonlib.ru">PythonLib</a> <a href="/about">हमारे बारे में</a> </body></html>)";
GumboOutput* output = gumbo_parse(html.c_str()); std::vector<std::string> links; extract_links(output->root, links);
for (const auto& link : links) { std::cout << "लिंक मिला: " << link << std::endl; }
gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}आउटपुट:
लिंक मिला: https://pythonlib.ruलिंक मिला: /about2. libxml2: HTML मॉड्यूल के साथ सार्वभौमिक पार्सर
libxml2 XML और HTML के साथ काम करने के लिए एक शक्तिशाली लाइब्रेरी है। इसका HTML पार्सर उन्हीं सिद्धांतों पर आधारित है जैसे XML पार्सर, लेकिन HTML के गैर-सख्त सिंटैक्स के लिए अनुकूलित है। लाभ:
- तत्वों के चयन के लिए XPath समर्थन
- एन्कोडिंग के लिए अंतर्निहित समर्थन
- स्थिरता और व्यापक वितरण
- XSLT के साथ काम करने की क्षमता
स्थापना (Ubuntu/Debian):
sudo apt-get install libxml2-dev libxslt1-devसभी h2 शीर्षकों को खोजने के लिए XPath का उपयोग करने का उदाहरण:
#include <libxml/HTMLparser.h>#include <libxml/xpath.h>#include <iostream>
int main() { const char* html = "<html><body><h2>शीर्षक 1</h2><h2>शीर्षक 2</h2></body></html>"; htmlDocPtr doc = htmlReadDoc( reinterpret_cast<const xmlChar*>(html), nullptr, nullptr, HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING );
xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); xmlXPathObjectPtr