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 installExemplo 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: /about2. 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-devExemplo 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 Também na biblioteca
ORM para C++: comparação e exemplos de uso (ODB, SOCI, SQLiteCpp)
Criptografia em Java: criptografia e hash – guia prático
Configuração de aplicações Go (Golang): bibliotecas e ferramentas
Dapper para C# (.NET): guia completo com exemplos
Análise de HTML em Rust: bibliotecas e exemplos para web scraping