Парсинг HTML в JavaScript (Node.js): выбор инструмента для работы с веб-страницами
Парсинг HTML — одна из ключевых задач при разработке веб-скраперов, анализаторов контента и автоматизированных тестов. В экосистеме Node.js существует несколько мощных библиотек, каждая из которых имеет свои сильные стороны. В этой статье мы рассмотрим три основных инструмента: cheerio, jsdom и htmlparser2, а также разберём, когда и какой из них лучше использовать.
1. Cheerio — jQuery для сервера
Библиотека cheerio — это самый популярный выбор для парсинга HTML в Node.js. Она предоставляет знакомый jQuery-подобный синтаксис для навигации и манипуляции DOM-деревом. Cheerio не создаёт полный браузерный DOM, а работает с лёгкой абстракцией, что делает её очень быстрой.
Основные возможности:
- Поддержка CSS-селекторов (как в jQuery)
- Быстрый парсинг без выполнения JavaScript
- Иммутабельные методы (не изменяют исходный HTML)
- Работа с атрибутами, текстом и HTML-структурой
Пример использования:
const cheerio = require('cheerio');
const html = '<div class="content"><h1>Привет, мир!</h1><p>Текст статьи</p></div>';
const $ = cheerio.load(html);
const title = $('h1').text();
const paragraphs = $('p').map((i, el) => $(el).text()).get();
console.log(title); // "Привет, мир!"
console.log(paragraphs); // ["Текст статьи"]
2. JSDOM — полноценный браузер в Node.js
Если вам нужно не только парсить статический HTML, но и выполнять JavaScript-скрипты, эмулировать события или работать с современными API (например, fetch, localStorage), то jsdom — ваш выбор. Он создаёт полную браузерную среду, что даёт максимальную совместимость, но требует больше ресурсов.
Когда использовать jsdom:
- Сайты с динамическим контентом (SPA на React/Vue)
- Необходимость выполнять скрипты страницы
- Тестирование веб-компонентов
- Работа с событиями и асинхронными операциями
Пример парсинга:
const { JSDOM } = require('jsdom');
const html = '<html><body><div id="app">Контент</div></body></html>';
const dom = new JSDOM(html);
const document = dom.window.document;
const content = document.getElementById('app').textContent;
console.log(content); // "Контент"
3. Htmlparser2 — максимальная производительность
Библиотека htmlparser2 — это низкоуровневый парсер, который работает на основе событий (SAX-подобный подход). Он не создаёт DOM-дерево, а генерирует события при встрече каждого тега, атрибута или текстового узла. Это делает его самым быстрым парсером в Node.js.
Особенности:
- Потоковая обработка (можно парсить файлы гигабайтного размера)
- Минимальное потребление памяти
- Поддержка XML и HTML
- Нет встроенных методов для навигации (нужно писать свою логику)
Пример использования:
const htmlparser2 = require('htmlparser2');
const html = '<div class="item">Товар 1</div><div class="item">Товар 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());
delete this.currentItem;
}
}
});
parser.write(html);
parser.end();
console.log(items); // ["Товар 1", "Товар 2"]
Сравнение библиотек
Чтобы сделать правильный выбор, важно понимать различия между инструментами. Ниже приведена таблица сравнения по ключевым параметрам:
- Скорость парсинга: htmlparser2 > cheerio > jsdom
Также в библиотеке
JavaMail (Jakarta Mail) для Java: полное руководство с примерами
MapStruct для Java: полное руководство с примерами
JWT токены в Swift: полное руководство по работе с JSON Web Tokens
Логирование в Swift (iOS/macOS): SwiftyBeaver, XCGLogger, OSLog