تحليل HTML في C++: نظرة عامة على المكتبات وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحليل 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تم العثور على رابط: /about


2. 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

توصيات