Analyse HTML en C++ : aperçu des bibliothèques et exemples pratiques
L'analyse HTML en C++ est une tâche à laquelle les développeurs sont confrontés lors de la création de web scrapers, d'analyseurs de contenu ou d'outils d'extraction de données. Contrairement à Python, où BeautifulSoup et lxml sont la norme, il n'existe pas de solution dominante unique en C++. Cependant, il existe plusieurs bibliothèques matures et performantes qui permettent de travailler efficacement avec des documents HTML.
Dans cet article, nous examinerons les trois bibliothèques les plus populaires pour l'analyse HTML en C++ : Gumbo-parser (de Google), libxml2 (avec le module HTML) et MyHTML. Nous fournirons des exemples de code, comparerons leurs fonctionnalités et donnerons des recommandations pour le choix.
1. Gumbo-parser : la fiabilité de Google
Gumbo-parser est une bibliothèque de Google qui implémente l'analyse HTML5 conformément à la spécification WHATWG. Elle est écrite en C pur, ce qui la rend légère et rapide. Principaux avantages :
- Prise en charge complète de HTML5 (y compris les documents non valides)
- Nombre minimal de dépendances
- API simple pour parcourir l'arbre DOM
- Haute performance
Installation :
git clone https://github.com/google/gumbo-parsercd gumbo-parser./autogen.sh./configuremakesudo make installExemple d'analyse HTML et d'extraction de tous les liens :
#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">À propos</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 << "Lien trouvé : " << link << std::endl; }
gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}Sortie :
Lien trouvé : https://pythonlib.ruLien trouvé : /about2. libxml2 : analyseur universel avec module HTML
libxml2 est une bibliothèque puissante pour travailler avec XML et HTML. Son analyseur HTML est basé sur les mêmes principes que l'analyseur XML, mais adapté à la syntaxe non stricte du HTML. Avantages :
- Prise en charge de XPath pour la sélection d'éléments
- Prise en charge intégrée des encodages
- Stabilité et large diffusion
- Possibilité de travailler avec XSLT
Installation (Ubuntu/Debian) :
sudo apt-get install libxml2-dev libxslt1-devExemple d'utilisation de XPath pour rechercher tous les titres h2 :
#include <libxml/HTMLparser.h>#include <libxml/xpath.h>#include <iostream>
int main() { const char* html = "<html><body><h2>Titre 1</h2><h2>Titre 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 Aussi dans la bibliothèque
CMake pour C++ : guide complet avec exemples
Géolocalisation et cartes en Swift pour iOS/macOS : guide complet
Envoi d'email en Rust : bibliothèques lettre et mailparse pour les courriels
Génération de rapports PDF en Java : aperçu des bibliothèques et outils
Travailler avec Excel en C++ : bibliothèques, exemples et outils