Analyse HTML en C++ : aperçu des outils et exemples pratiques
L'analyse HTML en C++ est une tâche à laquelle les développeurs sont confrontés lors de la création d'analyseurs de pages web, d'analyseurs de contenu ou d'outils de collecte automatisée de données. Contrairement à Python ou JavaScript, C++ ne dispose pas de bibliothèque intégrée pour travailler avec des documents HTML, mais il existe plusieurs solutions matures et performantes. Dans cet article, nous examinerons les principales bibliothèques pour l'analyse HTML en C++, leurs caractéristiques et fournirons des exemples de code.
Principales bibliothèques pour l'analyse HTML en C++
Le choix de la bibliothèque dépend de vos besoins : avez-vous besoin du support des sélecteurs CSS, XPath, du travail avec du HTML endommagé ou d'une vitesse maximale ? Examinons les options les plus populaires.
- Gumbo-parser — bibliothèque de Google implémentant l'analyse HTML5 selon la spécification. Elle fournit un arbre DOM après l'analyse, mais n'inclut pas de moyens intégrés pour la navigation par sélecteurs. Nécessite un parcours manuel des nœuds.
- MyHTML — fork de Gumbo avec un support amélioré des sélecteurs CSS et une API plus pratique. Permet de rechercher des éléments par classes, balises et attributs.
- Lexbor — bibliothèque moderne axée sur la vitesse et la conformité aux normes. Prend en charge à la fois HTML et les sélecteurs CSS, ainsi que XPath (via un module supplémentaire).
- htmlcxx — bibliothèque simple pour analyser le HTML en arbre. Convient aux petits projets, mais ne prend pas en charge HTML5.
- Boost.PropertyTree (avec analyseur XML) — peut être utilisé pour analyser XHTML, mais n'est pas destiné au HTML non valide.
Installation et configuration
Examinons l'installation des deux bibliothèques les plus populaires : Gumbo-parser et MyHTML. Pour les projets en C++17, il est recommandé d'utiliser le gestionnaire de paquets vcpkg ou Conan.
// Installation via vcpkgvcpkg install gumbo-parservcpkg install myhtml
// Configuration dans CMakeLists.txtfind_package(gumbo REQUIRED)target_link_libraries(your_project PRIVATE gumbo)
find_package(myhtml REQUIRED)target_link_libraries(your_project PRIVATE myhtml)Exemple 1 : Analyse HTML avec Gumbo-parser (parcours manuel du DOM)
Dans cet exemple, nous analyserons un simple document HTML et extrairons tous les textes des balises <p>.
#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) { // Traiter les nœuds enfants 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; } // Parcours récursif pour les autres éléments 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>Premier paragraphe</p><p>Deuxième paragraphe</p></body></html>)"; GumboOutput* output = gumbo_parse(html.c_str()); extract_text(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}Exemple 2 : Utilisation de MyHTML avec des sélecteurs CSS
MyHTML fournit une interface plus pratique pour la recherche d'éléments. Dans cet exemple, nous trouverons tous les liens avec la classe link et afficherons leur attribut href.
Aussi dans la bibliothèque
Files d'attente de tâches en Swift : GCD, OperationQueue et Swift Concurrency
Client Redis pour C# (.NET) : StackExchange.Redis — connexion et exemples
Conteneur d'injection de dépendances pour JavaScript (Node.js) — Awilix
Jackson pour Java : guide complet avec exemples
Rate Limiting en Go : guide de limitation du débit des requêtes
Recommendations