Análise de HTML em C++: Visão geral das bibliotecas Gumbo, MyHTML e htmlcxx

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

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

Recommendations