HTML-Parsing in C++: Überblick über Werkzeuge und praktische Beispiele
HTML-Parsing in C++ ist eine Aufgabe, mit der Entwickler bei der Erstellung von Webseiten-Parsern, Content-Analyse-Tools oder Werkzeugen für die automatisierte Datensammlung konfrontiert werden. Im Gegensatz zu Python oder JavaScript gibt es in C++ keine eingebaute Bibliothek für die Arbeit mit HTML-Dokumenten, jedoch existieren mehrere ausgereifte und leistungsstarke Lösungen. In diesem Artikel betrachten wir die wichtigsten Bibliotheken für das HTML-Parsing in C++, ihre Besonderheiten und geben Codebeispiele.
Wichtige Bibliotheken für das HTML-Parsing in C++
Die Wahl der Bibliothek hängt von Ihren Aufgaben ab: Benötigen Sie Unterstützung für CSS-Selektoren, XPath, die Arbeit mit fehlerhaftem HTML oder maximale Geschwindigkeit. Betrachten wir die gängigsten Optionen.
- Gumbo-parser — eine Bibliothek von Google, die HTML5-Parsing gemäß der Spezifikation implementiert. Sie liefert nach dem Parsen einen DOM-Baum, enthält jedoch keine integrierten Mittel zur Navigation über Selektoren. Erfordert manuelles Durchlaufen der Knoten.
- MyHTML — ein Fork von Gumbo mit verbesserter Unterstützung für CSS-Selektoren und einer benutzerfreundlicheren API. Ermöglicht die Suche nach Elementen anhand von Klassen, Tags und Attributen.
- Lexbor — eine moderne Bibliothek mit Fokus auf Geschwindigkeit und Standardkonformität. Unterstützt sowohl HTML als auch CSS-Selektoren sowie XPath (über ein zusätzliches Modul).
- htmlcxx — eine einfache Bibliothek zum Parsen von HTML in einen Baum. Geeignet für kleine Projekte, unterstützt jedoch kein HTML5.
- Boost.PropertyTree (mit XML-Parser) — kann zum Parsen von XHTML verwendet werden, ist jedoch nicht für ungültiges HTML ausgelegt.
Installation und Einbindung
Betrachten wir die Installation der beiden gängigsten Bibliotheken: Gumbo-parser und MyHTML. Für Projekte mit C++17 wird die Verwendung des Paketmanagers vcpkg oder Conan empfohlen.
// Installation über vcpkgvcpkg install gumbo-parservcpkg install myhtml
// Einbindung in CMakeLists.txtfind_package(gumbo REQUIRED)target_link_libraries(your_project PRIVATE gumbo)
find_package(myhtml REQUIRED)target_link_libraries(your_project PRIVATE myhtml)Beispiel 1: HTML-Parsing mit Gumbo-parser (manuelles DOM-Durchlaufen)
In diesem Beispiel parsen wir ein einfaches HTML-Dokument und extrahieren alle Texte aus den <p>-Tags.
#include <iostream>#include <string>#include <gumbo.h>
void extract_text(GumboNode* node) { if (node->type == GUMBO_NODE_TEXT) { std::cout << node->v.text.text; return; } if (node->type == GUMBO_NODE_ELEMENT && node->v.element.tag == GUMBO_TAG_P) { // Verarbeite Kindknoten GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_text(static_cast<GumboNode*>(children->data[i])); } std::cout << std::endl; return; } // Rekursives Durchlaufen für andere Elemente if (node->type == GUMBO_NODE_ELEMENT) { GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_text(static_cast<GumboNode*>(children->data[i])); } }}
int main() { std::string html = R"(<html><body><p>Erster Absatz</p><p>Zweiter Absatz</p></body></html>)"; GumboOutput* output = gumbo_parse(html.c_str()); extract_text(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}Beispiel 2: Verwendung von MyHTML mit CSS-Selektoren
MyHTML bietet eine benutzerfreundlichere Oberfläche zum Suchen von Elementen. In diesem Beispiel finden wir alle Links mit der Klasse link und geben deren href-Attribut aus.
Auch in der Bibliothek
Rate Limiting in C# (.NET): Vollständiger Leitfaden zur Bibliothek System.Threading.RateLimiting
Aufgabenplaner in Node.js: node-cron, node-schedule und Bull
Arbeiten mit CSV in Rust: Bibliotheken csv, serde und effiziente Datenverarbeitung
JWT-Token in Swift: Arbeiten mit JSON Web Token auf iOS/macOS
OpenAPI / Swagger für Java: Vollständige Anleitung mit Beispielen
Empfehlungen