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.
Também na biblioteca
Trabalhando com CSV em Go (Golang): guia completo para encoding/csv
Agendador de Tarefas Swift: GCD, OperationQueue e Timer no iOS/macOS
Aprendizado de Máquina em PHP: visão geral das bibliotecas para integração de ML
Autorização e Autenticação em JavaScript (Node.js): Guia Completo
Envio de Email em Swift: Guia Completo sobre SMTP e MailKit
Recommendations