Parseo de HTML en JavaScript (Node.js): selección de herramientas para trabajar con páginas web
El parseo de HTML es una de las tareas clave en el desarrollo de web scrapers, analizadores de contenido y pruebas automatizadas. En el ecosistema de Node.js existen varias bibliotecas potentes, cada una con sus fortalezas. En este artículo analizaremos tres herramientas principales: cheerio, jsdom y htmlparser2, y veremos cuándo y cuál es mejor usar.
1. Cheerio — jQuery para el servidor
La biblioteca cheerio es la opción más popular para el parseo de HTML en Node.js. Proporciona una sintaxis familiar similar a jQuery para la navegación y manipulación del árbol DOM. Cheerio no crea un DOM completo del navegador, sino que trabaja con una abstracción ligera, lo que la hace muy rápida.
Características principales:
- Soporte de selectores CSS (como en jQuery)
- Parseo rápido sin ejecutar JavaScript
- Métodos inmutables (no modifican el HTML original)
- Trabajo con atributos, texto y estructura HTML
Ejemplo de uso:
const cheerio = require('cheerio');const html = '<div class="content"><h1>¡Hola, mundo!</h1><p>Texto del artículo</p></div>';
const $ = cheerio.load(html);const title = $('h1').text();const paragraphs = $('p').map((i, el) => $(el).text()).get();
console.log(title); // "¡Hola, mundo!"console.log(paragraphs); // ["Texto del artículo"]2. JSDOM — navegador completo en Node.js
Si necesita no solo parsear HTML estático, sino también ejecutar scripts de JavaScript, emular eventos o trabajar con APIs modernas (por ejemplo, fetch, localStorage), entonces jsdom es su opción. Crea un entorno completo de navegador, lo que brinda la máxima compatibilidad, pero requiere más recursos.
Cuándo usar jsdom:
- Sitios con contenido dinámico (SPA en React/Vue)
- Necesidad de ejecutar scripts de la página
- Pruebas de componentes web
- Trabajo con eventos y operaciones asíncronas
Ejemplo de parseo:
const { JSDOM } = require('jsdom');const html = '<html><body><div id="app">Contenido</div></body></html>';
const dom = new JSDOM(html);const document = dom.window.document;const content = document.getElementById('app').textContent;
console.log(content); // "Contenido"3. Htmlparser2 — máximo rendimiento
La biblioteca htmlparser2 es un parser de bajo nivel que funciona basado en eventos (enfoque similar a SAX). No crea un árbol DOM, sino que genera eventos al encontrar cada etiqueta, atributo o nodo de texto. Esto la convierte en el parser más rápido de Node.js.
Características:
- Procesamiento en flujo (se pueden parsear archivos de tamaño gigabyte)
- Consumo mínimo de memoria
- Soporte para XML y HTML
- No tiene métodos integrados para navegación (hay que escribir su propia lógica)
Ejemplo de uso:
const htmlparser2 = require('htmlparser2');const html = '<div class="item">Producto 1</div><div class="item">Producto 2</div>';
const items = [];const parser = new htmlparser2.Parser({ onopentag(name, attribs) { if (name === 'div' && attribs.class === 'item') { this.currentItem = ''; } }, ontext(text) { if (this.currentItem !== undefined) { this.currentItem += text; } }, onclosetag(name) { if (name === 'div' && this.currentItem !== undefined) { items.push(this.currentItem.trim() También en la biblioteca
NestJS para TypeScript: guía completa con ejemplos
BenchmarkDotNet para C# (.NET): guía completa con ejemplos
Criptografía en C# (.NET): cifrado y hash de datos