Análisis de HTML en C++: resumen de herramientas y ejemplos prácticos
El análisis de HTML en C++ es una tarea que enfrentan los desarrolladores al crear analizadores de páginas web, analizadores de contenido o herramientas para la recopilación automatizada de datos. A diferencia de Python o JavaScript, C++ no tiene una biblioteca incorporada para trabajar con documentos HTML, sin embargo, existen varias soluciones maduras y de alto rendimiento. En este artículo, revisaremos las principales bibliotecas para el análisis de HTML en C++, sus características y proporcionaremos ejemplos de código.
Principales bibliotecas para el análisis de HTML en C++
La elección de la biblioteca depende de sus necesidades: si necesita soporte para selectores CSS, XPath, trabajar con HTML dañado o la máxima velocidad. Consideremos las opciones más populares.
- Gumbo-parser — biblioteca de Google que implementa el análisis de HTML5 según la especificación. Proporciona un árbol DOM después del análisis, pero no incluye herramientas integradas para la navegación por selectores. Requiere recorrido manual de nodos.
- MyHTML — bifurcación de Gumbo con soporte mejorado para selectores CSS y una API más conveniente. Permite buscar elementos por clases, etiquetas y atributos.
- Lexbor — biblioteca moderna centrada en la velocidad y el cumplimiento de estándares. Soporta tanto selectores HTML como CSS, así como XPath (a través de un módulo adicional).
- htmlcxx — biblioteca simple para analizar HTML en un árbol. Adecuada para proyectos pequeños, pero no soporta HTML5.
- Boost.PropertyTree (con analizador XML) — se puede utilizar para analizar XHTML, pero no está diseñado para HTML no válido.
Instalación y configuración
Consideremos la instalación de las dos bibliotecas más populares: Gumbo-parser y MyHTML. Para proyectos en C++17, se recomienda usar el gestor de paquetes vcpkg o Conan.
// Instalación a través de vcpkgvcpkg install gumbo-parservcpkg install myhtml
// Configuración en CMakeLists.txtfind_package(gumbo REQUIRED)target_link_libraries(your_project PRIVATE gumbo)
find_package(myhtml REQUIRED)target_link_libraries(your_project PRIVATE myhtml)Ejemplo 1: Análisis de HTML con Gumbo-parser (recorrido manual del DOM)
En este ejemplo, analizaremos un documento HTML simple y extraeremos todos los textos de las etiquetas <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) { // Procesamos los nodos hijos 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; } // Recorrido recursivo para otros 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>Primer párrafo</p><p>Segundo párrafo</p></body></html>)"; GumboOutput* output = gumbo_parse(html.c_str()); extract_text(output->root); gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}Ejemplo 2: Uso de MyHTML con selectores CSS
MyHTML proporciona una interfaz más conveniente para buscar elementos. En este ejemplo, encontraremos todos los enlaces con la clase link y mostraremos su atributo href.
También en la biblioteca
Recommendations