Analyse HTML en C++ : Aperçu des bibliothèques Gumbo, MyHTML et htmlcxx

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Analyse HTML en C++ : Aperçu des meilleures bibliothèques

L'analyse (parsing) de documents HTML est l'une des tâches clés lors du développement de parseurs, de scrappeurs web et d'outils d'analyse de données. Bien que le C++ ne soit pas le langage le plus populaire pour ces tâches (cédant la place à Python ou JavaScript), il existe des bibliothèques puissantes et hautes performances permettant de travailler efficacement avec le HTML. Dans cet article, nous examinerons trois solutions parmi les plus matures : Gumbo-parser de Google, MyHTML et htmlcxx. Nous analyserons leurs API, leurs particularités et fournirons des exemples pratiques de code.



1. Gumbo-parser (Google)

Gumbo est une bibliothèque d'analyse HTML5 développée par les ingénieurs de Google. Elle est entièrement conforme à la spécification WHATWG HTML5 et se distingue par une grande résistance au code HTML "sale". Principaux avantages :

  • API C pure sans dépendances externes.
  • Prise en charge de tous les éléments HTML5, y compris SVG et MathML.
  • Retourne un arbre DOM complet avec un imbrication correcte.
  • Haute vitesse de fonctionnement (les benchmarks natifs montrent jusqu'à 50 Mo/s).


Exemple d'utilisation de Gumbo-parser

Dans cet exemple, nous allons extraire tous les liens (<a>) d'un document HTML :

#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 << "Lien trouvé : " << href->value << std::endl; } }

// Parcours récursif des éléments enfants 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'>Exemple</a></body></html>"; GumboOutput* output = gumbo_parse(html.c_str()); extract_links(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}

Comme vous pouvez le voir, travailler avec Gumbo nécessite une gestion manuelle de la mémoire et un parcours récursif de l'arbre. Pour les grands documents, il est recommandé d'utiliser une approche itérative ou une pile.



2. MyHTML — un parseur rapide et léger

MyHTML est une bibliothèque écrite en C visant une performance maximale. Elle ne construit pas un arbre DOM complet, mais utilise une approche de type SAX (parcours séquentiel des tokens). Cela la rend idéale pour les tâches où il faut extraire rapidement des données sans construire une hiérarchie complexe.



Caractéristiques clés de MyHTML

  • Architecture modulaire : parseur + sérialiseur + API de flux.
  • Prise en charge des encodages (UTF-8, Windows-1251, KOI8-R, etc.).
  • Possibilité de travailler avec des fragments HTML (sans <html> obligatoire).
  • Faible consommation mémoire — ne stocke pas tout l'arbre.


Exemple : compter toutes les balises <div> avec la classe "content"

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

int main() { // Initialisation du parseur myhtml_t* myhtml = myhtml_create(); myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0);

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

// Recherche d'éléments par sélecteur CSS myhtml_collection_t* collection = myhtml_collection_create(1, 1); myhtml_css_match_selector(tree, tree->node, "div.con

Recommendations