Парсинг HTML в Node.js: обзор лучших библиотек и инструментов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Парсинг 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

Рекомендаций