تحليل HTML في C++: نظرة عامة على المكتبات وأمثلة عملية
تحليل HTML بلغة C++ هي مهمة يواجهها المطورون عند إنشاء أدوات استخراج بيانات الويب، محللي المحتوى، أو أدوات استخراج البيانات. على عكس Python، حيث تعد BeautifulSoup و lxml المعيار، لا يوجد حل مهيمن واحد في C++. ومع ذلك، هناك العديد من المكتبات الناضجة وعالية الأداء التي تسمح بالعمل بكفاءة مع مستندات HTML.
في هذه المقالة، سنستعرض ثلاث مكتبات الأكثر شيوعًا لتحليل HTML بلغة C++: Gumbo-parser (من Google)، libxml2 (مع وحدة HTML)، و MyHTML. سنقدم أمثلة الكود، ونقارن إمكانياتها، ونقدم توصيات للاختيار.
1. Gumbo-parser: الموثوقية من Google
Gumbo-parser هي مكتبة من Google تنفذ تحليل HTML5 وفقًا لمواصفات WHATWG. إنها مكتوبة بلغة C النقية، مما يجعلها خفيفة وسريعة. المزايا الرئيسية:
- دعم كامل لـ HTML5 (بما في ذلك المستندات غير الصالحة)
- الحد الأدنى من التبعيات
- واجهة برمجة تطبيقات بسيطة لاجتياز شجرة DOM
- أداء عالي
التثبيت:
git clone https://github.com/google/gumbo-parsercd gumbo-parser./autogen.sh./configuremakesudo make installمثال على تحليل HTML واستخراج جميع الروابط:
#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مثال على استخدام XPath للبحث عن جميع العناوين h2:
#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