HTML-Parsing in C++: Überblick über Bibliotheken und Codebeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

HTML-Parsing in C++: Überblick über Bibliotheken und praktische Beispiele



HTML-Parsing in C++ ist eine Aufgabe, mit der Entwickler bei der Erstellung von Web-Scraping-Tools, Inhaltsanalysatoren oder Datenextraktionstools konfrontiert werden. Im Gegensatz zu Python, wo BeautifulSoup und lxml der Standard sind, gibt es in C++ keine einzige dominierende Lösung. Es gibt jedoch mehrere ausgereifte und leistungsstarke Bibliotheken, die eine effiziente Arbeit mit HTML-Dokumenten ermöglichen.



In diesem Artikel betrachten wir die drei beliebtesten Bibliotheken für das HTML-Parsing in C++: Gumbo-parser (von Google), libxml2 (mit HTML-Modul) und MyHTML. Wir zeigen Codebeispiele, vergleichen ihre Funktionen und geben Empfehlungen zur Auswahl.



1. Gumbo-parser: Zuverlässigkeit von Google



Gumbo-parser ist eine Bibliothek von Google, die HTML5-Parsing gemäß der WHATWG-Spezifikation implementiert. Sie ist in reinem C geschrieben, was sie leichtgewichtig und schnell macht. Hauptvorteile:



  • Vollständige Unterstützung von HTML5 (einschließlich ungültiger Dokumente)
  • Minimale Anzahl von Abhängigkeiten
  • Einfache API zum Durchlaufen des DOM-Baums
  • Hohe Leistung


Installation:

git clone https://github.com/google/gumbo-parsercd gumbo-parser./autogen.sh./configuremakesudo make install


Beispiel für das Parsen von HTML und Extrahieren aller Links:

#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">Über uns</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 gefunden: " << link << std::endl; }

gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}


Ausgabe:

Link gefunden: https://pythonlib.ruLink gefunden: /about


2. libxml2: Universeller Parser mit HTML-Modul



libxml2 ist eine leistungsstarke Bibliothek für die Arbeit mit XML und HTML. Ihr HTML-Parser basiert auf denselben Prinzipien wie der XML-Parser, ist jedoch an die nicht-strenge Syntax von HTML angepasst. Vorteile:



  • Unterstützung von XPath für die Elementauswahl
  • Integrierte Unterstützung von Zeichenkodierungen
  • Stabilität und weite Verbreitung
  • Möglichkeit der Arbeit mit XSLT


Installation (Ubuntu/Debian):

sudo apt-get install libxml2-dev libxslt1-dev


Beispiel für die Verwendung von XPath zum Finden aller h2-Überschriften:

#include <libxml/HTMLparser.h>#include <libxml/xpath.h>#include <iostream>

int main() { const char* html = "<html><body><h2>Überschrift 1</h2><h2>Überschrift 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

Empfehlungen