Análise de HTML em C++: Visão geral das melhores bibliotecas
A análise (parsing) de documentos HTML é uma das tarefas principais no desenvolvimento de parsers, web scrapers e ferramentas de análise de dados. Apesar de C++ não ser a linguagem mais popular para tais tarefas (perdendo para Python ou JavaScript), existem bibliotecas poderosas e de alto desempenho que permitem trabalhar eficientemente com HTML. Neste artigo, examinaremos três das soluções mais maduras: Gumbo-parser do Google, MyHTML e htmlcxx. Analisaremos suas APIs, características e forneceremos exemplos práticos de código.
1. Gumbo-parser (Google)
Gumbo é uma biblioteca para análise de HTML5, desenvolvida por engenheiros do Google. Ela está totalmente em conformidade com a especificação WHATWG HTML5 e se destaca pela alta resistência a código HTML "sujo". Principais vantagens:
- API C pura, sem dependências externas.
- Suporte a todos os elementos HTML5, incluindo SVG e MathML.
- Retorna uma árvore DOM completa com aninhamento correto.
- Alta velocidade de operação (benchmarks nativos mostram até 50 MB/s).
Exemplo de uso do Gumbo-parser
Neste exemplo, extrairemos todos os links (<a>) de um documento HTML:
#include <iostream>#include <string>#include "gumbo.h"
void extract_links(GumboNode* node) { if (node->type != GUMBO_NODE_ELEMENT) return;
GumboAttribute* href = nullptr; if (node->v.element.tag == GUMBO_TAG_A) { href = gumbo_get_attribute(&node->v.element.attributes, "href"); if (href) { std::cout << "Link encontrado: " << href->value << std::endl; } }
// Percorrimento recursivo dos elementos filhos const GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_links(static_cast<GumboNode*>(children->data[i])); }}
int main() { std::string html = "<html><body><a href='https://example.com'>Exemplo</a></body></html>"; GumboOutput* output = gumbo_parse(html.c_str()); extract_links(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}Como você pode ver, trabalhar com Gumbo requer gerenciamento manual de memória e percorrimento recursivo da árvore. Para documentos grandes, recomenda-se usar uma abordagem iterativa ou pilha.
2. MyHTML — um parser rápido e leve
MyHTML é uma biblioteca escrita em C com foco em desempenho máximo. Ela não constrói uma árvore DOM completa, mas usa uma abordagem semelhante a SAX (percorrimento sequencial de tokens). Isso a torna ideal para tarefas onde é necessário extrair dados rapidamente sem construir uma hierarquia complexa.
Principais características do MyHTML
- Arquitetura modular: parser + serializador + API de fluxo.
- Suporte a codificações (UTF-8, Windows-1251, KOI8-R e outras).
- Possibilidade de trabalhar com fragmentos HTML (sem <html> obrigatório).
- Baixo consumo de memória — não armazena toda a árvore.
Exemplo: contagem de todas as tags <div> com a classe "content"
#include <iostream>#include "myhtml/api.h"
int main() { // Inicialização do parser myhtml_t* myhtml = myhtml_create(); myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0);
// Análise do HTML const char* html = "<div class='content'>Bloco 1</div><div>Bloco 2</div>"; myhtml_tree_t* tree = myhtml_tree_create(); myhtml_tree_init(tree, myhtml); myhtml_parse(tree, MyENCODING_UTF_8, html, strlen(html));
// Busca de elementos por seletor CSS myhtml_collection_t* collection = myhtml_collection_create(1, 1); myhtml_css_match_selector(tree, tree->node, "div.con Também na biblioteca
WireMock.Net para C# (.NET): guia completo com exemplos
Filas de Tarefas em Swift: GCD, OperationQueue e Swift Concurrency
Validação de dados em Swift (iOS/macOS): ferramentas e prática
Trabalhando com XML em Rust: bibliotecas quick-xml, roxmltree e serde_xml_rs
Trabalhando com CSV em JavaScript (Node.js): bibliotecas, parsing e geração de dados