Analyse HTML en C++ : aperçu des bibliothèques et exemples de code

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 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 install


Exemple 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é : /about


2. 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-dev


Exemple 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

Recommendations