Parsing de HTML em C++: visão geral das bibliotecas e exemplos de código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Parsing de HTML em C++: visão geral das bibliotecas e exemplos práticos



O parsing de HTML em C++ é uma tarefa que os desenvolvedores enfrentam ao criar web scrapers, analisadores de conteúdo ou ferramentas para extração de dados. Ao contrário do Python, onde BeautifulSoup e lxml são o padrão, em C++ não existe uma solução única dominante. No entanto, existem várias bibliotecas maduras e de alto desempenho que permitem trabalhar eficientemente com documentos HTML.



Neste artigo, vamos examinar as três bibliotecas mais populares para parsing de HTML em C++: Gumbo-parser (do Google), libxml2 (com módulo HTML) e MyHTML. Forneceremos exemplos de código, compararemos seus recursos e daremos recomendações de escolha.



1. Gumbo-parser: confiabilidade do Google



Gumbo-parser é uma biblioteca do Google que implementa o parsing de HTML5 de acordo com a especificação WHATWG. Ela é escrita em C puro, o que a torna leve e rápida. Principais vantagens:



  • Suporte completo a HTML5 (incluindo documentos inválidos)
  • Número mínimo de dependências
  • API simples para percorrer a árvore DOM
  • Alto desempenho


Instalação:

git clone https://github.com/google/gumbo-parsercd gumbo-parser./autogen.sh./configuremakesudo make install


Exemplo de parsing de HTML e extração de todos os links:

#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">Sobre nós</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 << "Link encontrado: " << link << std::endl; }

gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}


Saída:

Link encontrado: https://pythonlib.ruLink encontrado: /about


2. libxml2: parser universal com módulo HTML



libxml2 é uma biblioteca poderosa para trabalhar com XML e HTML. Seu parser HTML é baseado nos mesmos princípios do parser XML, mas adaptado para a sintaxe não estrita do HTML. Vantagens:



  • Suporte a XPath para seleção de elementos
  • Suporte embutido a codificações
  • Estabilidade e ampla distribuição
  • Possibilidade de trabalhar com XSLT


Instalação (Ubuntu/Debian):

sudo apt-get install libxml2-dev libxslt1-dev


Exemplo de uso de XPath para buscar todos os títulos h2:

#include <libxml/HTMLparser.h>#include <libxml/xpath.h>#include <iostream>

int main() { const char* html = "<html><body><h2>Título 1</h2><h2>Título 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