HTML-Parsing in C++: Überblick über die Bibliotheken Gumbo, MyHTML und htmlcxx

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 die besten Bibliotheken

Das Parsen von HTML-Dokumenten ist eine der Kernaufgaben bei der Entwicklung von Parsern, Web-Scraping-Tools und Datenanalysetools. Obwohl C++ nicht die beliebteste Sprache für solche Aufgaben ist (hinter Python oder JavaScript), gibt es leistungsstarke und hochperformante Bibliotheken, die eine effiziente Arbeit mit HTML ermöglichen. In diesem Artikel betrachten wir drei der ausgereiftesten Lösungen: Gumbo-parser von Google, MyHTML und htmlcxx. Wir analysieren ihre APIs, Besonderheiten und geben praktische Codebeispiele.



1. Gumbo-parser (Google)

Gumbo ist eine Bibliothek zum Parsen von HTML5, die von Ingenieuren bei Google entwickelt wurde. Sie entspricht vollständig der WHATWG HTML5-Spezifikation und zeichnet sich durch eine hohe Robustheit gegenüber "schmutzigem" HTML-Code aus. Hauptvorteile:

  • Saubere C-API ohne externe Abhängigkeiten.
  • Unterstützung aller HTML5-Elemente, einschließlich SVG und MathML.
  • Gibt einen vollständigen DOM-Baum mit korrekter Verschachtelung zurück.
  • Hohe Verarbeitungsgeschwindigkeit (native Benchmarks zeigen bis zu 50 MB/s).


Beispiel zur Verwendung von Gumbo-parser

In diesem Beispiel extrahieren wir alle Links (<a>) aus einem HTML-Dokument:

#include <iostream>#include <string>#include "gumbo.h"

void extract_links(GumboNode* node) { if (node->type != GUMBO_NODE_ELEMENT) return;

GumboAttribute* href = nullptr; if (node->v.element.tag == GUMBO_TAG_A) { href = gumbo_get_attribute(&node->v.element.attributes, "href"); if (href) { std::cout << "Link gefunden: " << href->value << std::endl; } }

// Rekursiver Durchlauf der Kindelemente const GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_links(static_cast<GumboNode*>(children->data[i])); }}

int main() { std::string html = "<html><body><a href='https://example.com'>Beispiel</a></body></html>"; GumboOutput* output = gumbo_parse(html.c_str()); extract_links(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}

Wie Sie sehen, erfordert die Arbeit mit Gumbo manuelle Speicherverwaltung und einen rekursiven Durchlauf des Baums. Für große Dokumente wird ein iterativer Ansatz oder ein Stack empfohlen.



2. MyHTML — schneller und leichter Parser

MyHTML ist eine in C geschriebene Bibliothek, die auf maximale Leistung ausgelegt ist. Sie erstellt keinen vollständigen DOM-Baum, sondern verwendet einen SAX-ähnlichen Ansatz (sequenzieller Token-Durchlauf). Dies macht sie ideal für Aufgaben, bei denen Daten schnell extrahiert werden müssen, ohne eine komplexe Hierarchie aufzubauen.



Wichtige Merkmale von MyHTML

  • Modulare Architektur: Parser + Serialisierer + Streaming-API.
  • Unterstützung für Kodierungen (UTF-8, Windows-1251, KOI8-R u.a.).
  • Möglichkeit der Arbeit mit HTML-Fragmenten (ohne zwingendes <html>).
  • Geringer Speicherverbrauch — speichert nicht den gesamten Baum.


Beispiel: Zählen aller <div>-Tags mit der Klasse "content"

#include <iostream>#include "myhtml/api.h"

int main() { // Initialisierung des Parsers myhtml_t* myhtml = myhtml_create(); myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0);

// HTML parsen const char* html = "<div class='content'>Block 1</div><div>Block 2</div>"; myhtml_tree_t* tree = myhtml_tree_create(); myhtml_tree_init(tree, myhtml); myhtml_parse(tree, MyENCODING_UTF_8, html, strlen(html));

// Suche nach Elementen mittels CSS-Selektor myhtml_collection_t* collection = myhtml_collection_create(1, 1); myhtml_css_match_selector(tree, tree->node, "div.con

Empfehlungen