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 installBeispiel 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: /about2. 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-devBeispiel 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 Auch in der Bibliothek
Kotlin QR-Code-Generator: Erstellung und Anpassung von QR-Codes
Objekt-Serialisierung in C++: Bibliotheken, Methoden und Codebeispiele
tsup für TypeScript: Komplettguide mit Beispielen
cast für Go: Vollständige Anleitung mit Beispielen