Parseo de HTML en C++: resumen de bibliotecas y ejemplos prácticos
El parseo de HTML en C++ es una tarea que enfrentan los desarrolladores al crear web scrapers, analizadores de contenido o herramientas para la extracción de datos. A diferencia de Python, donde BeautifulSoup y lxml son el estándar, en C++ no existe una solución única dominante. Sin embargo, existen varias bibliotecas maduras y de alto rendimiento que permiten trabajar eficientemente con documentos HTML.
En este artículo, analizaremos las tres bibliotecas más populares para el parseo de HTML en C++: Gumbo-parser (de Google), libxml2 (con módulo HTML) y MyHTML. Proporcionaremos ejemplos de código, compararemos sus capacidades y daremos recomendaciones para su elección.
1. Gumbo-parser: fiabilidad de Google
Gumbo-parser es una biblioteca de Google que implementa el parseo de HTML5 de acuerdo con la especificación WHATWG. Está escrita en C puro, lo que la hace ligera y rápida. Principales ventajas:
- Soporte completo de HTML5 (incluyendo documentos no válidos)
- Cantidad mínima de dependencias
- API simple para recorrer el árbol DOM
- Alto rendimiento
Instalación:
git clone https://github.com/google/gumbo-parsercd gumbo-parser./autogen.sh./configuremakesudo make installEjemplo de parseo de HTML y extracción de todos los enlaces:
#include <gumbo.h>#include <iostream>#include <string>#include <vector>
void extract_links(GumboNode* node, std::vector<std::string>& links) { if (node->type != GUMBO_NODE_ELEMENT) return;
GumboAttribute* href; if (node->v.element.tag == GUMBO_TAG_A && (href = gumbo_get_attribute(&node->v.element.attributes, "href"))) { links.push_back(href->value); }
const GumboVector* children = &node->v.element.children; for (unsigned int i = 0; i < children->length; ++i) { extract_links(static_cast<GumboNode*>(children->data[i]), links); }}
int main() { const std::string html = R"(<html><body> <a href="https://pythonlib.ru">PythonLib</a> <a href="/about">Sobre nosotros</a> </body></html>)";
GumboOutput* output = gumbo_parse(html.c_str()); std::vector<std::string> links; extract_links(output->root, links);
for (const auto& link : links) { std::cout << "Enlace encontrado: " << link << std::endl; }
gumbo_destroy_output(&kGumboDefaultOptions, output); return 0;}Salida:
Enlace encontrado: https://pythonlib.ruEnlace encontrado: /about2. libxml2: parser universal con módulo HTML
libxml2 es una potente biblioteca para trabajar con XML y HTML. Su parser HTML se basa en los mismos principios que el parser XML, pero está adaptado para la sintaxis no estricta de HTML. Ventajas:
- Soporte de XPath para la selección de elementos
- Soporte integrado de codificaciones
- Estabilidad y amplia difusión
- Posibilidad de trabajar con XSLT
Instalación (Ubuntu/Debian):
sudo apt-get install libxml2-dev libxslt1-devEjemplo de uso de XPath para buscar todos los encabezados h2:
#include <libxml/HTMLparser.h>#include <libxml/xpath.h>#include <iostream>
int main() { const char* html = "<html><body><h2>Encabezado 1</h2><h2>Encabezado 2</h2></body></html>"; htmlDocPtr doc = htmlReadDoc( reinterpret_cast<const xmlChar*>(html), nullptr, nullptr, HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING );
xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); xmlXPathObjectPtr También en la biblioteca
Rate Limiting en PHP: Limitación de frecuencia de solicitudes para proteger el sitio
Programación reactiva en TypeScript: la biblioteca RxJS
Cliente Elasticsearch para Java: guía completa para trabajar con Java Client