Parsing de HTML em C++: bibliotecas e exemplos para trabalhar com DOM e XPath

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 ferramentas e exemplos práticos



Fazer parsing de HTML em C++ é uma tarefa que os desenvolvedores enfrentam ao criar parsers de páginas web, analisadores de conteúdo ou ferramentas para coleta automatizada de dados. Ao contrário de Python ou JavaScript, C++ não possui uma biblioteca embutida para trabalhar com documentos HTML, no entanto, existem várias soluções maduras e de alto desempenho. Neste artigo, vamos explorar as principais bibliotecas para parsing de HTML em C++, suas características e fornecer exemplos de código.



Principais bibliotecas para parsing de HTML em C++



A escolha da biblioteca depende das suas necessidades: se precisa de suporte a seletores CSS, XPath, trabalho com HTML malformado ou velocidade máxima. Vamos considerar as opções mais populares.



  • Gumbo-parser — biblioteca do Google que implementa parsing de HTML5 de acordo com a especificação. Ela fornece uma árvore DOM após a análise, mas não inclui ferramentas embutidas para navegação por seletores. Requer travessia manual dos nós.
  • MyHTML — um fork do Gumbo com suporte aprimorado a seletores CSS e uma API mais conveniente. Permite pesquisar elementos por classes, tags e atributos.
  • Lexbor — biblioteca moderna focada em velocidade e conformidade com padrões. Suporta tanto HTML quanto seletores CSS, além de XPath (através de um módulo adicional).
  • htmlcxx — biblioteca simples para parsing de HTML em uma árvore. Adequada para projetos pequenos, mas não suporta HTML5.
  • Boost.PropertyTree (com parser XML) — pode ser usado para parsing de XHTML, mas não é destinado a HTML inválido.


Instalação e configuração



Vamos considerar a instalação das duas bibliotecas mais populares: Gumbo-parser e MyHTML. Para projetos em C++17, recomenda-se usar o gerenciador de pacotes vcpkg ou Conan.



// Instalação via vcpkgvcpkg install gumbo-parservcpkg install myhtml

// Configuração no CMakeLists.txtfind_package(gumbo REQUIRED)target_link_libraries(your_project PRIVATE gumbo)

find_package(myhtml REQUIRED)target_link_libraries(your_project PRIVATE myhtml)


Exemplo 1: Parsing de HTML com Gumbo-parser (travessia manual do DOM)



Neste exemplo, vamos analisar um documento HTML simples e extrair todos os textos das tags <p>.



#include <iostream>#include <string>#include <gumbo.h>

void extract_text(GumboNode* node) { if (node->type == GUMBO_NODE_TEXT) { std::cout << node->v.text.text; return; } if (node->type == GUMBO_NODE_ELEMENT && node->v.element.tag == GUMBO_TAG_P) { // Processa os nós filhos GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_text(static_cast<GumboNode*>(children->data[i])); } std::cout << std::endl; return; } // Travessia recursiva para outros elementos if (node->type == GUMBO_NODE_ELEMENT) { GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_text(static_cast<GumboNode*>(children->data[i])); } }}

int main() { std::string html = R"(<html><body><p>Primeiro parágrafo</p><p>Segundo parágrafo</p></body></html>)"; GumboOutput* output = gumbo_parse(html.c_str()); extract_text(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}


Exemplo 2: Usando MyHTML com seletores CSS



MyHTML fornece uma interface mais conveniente para pesquisar elementos. Neste exemplo, vamos encontrar todos os links com a classe link e exibir seu atributo href.



Recommendations