Cheerio для JavaScript (Node.js): полное руководство с примерами

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

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

Начать курс

Что такое Cheerio и зачем он нужен?

Cheerio — это быстрая, гибкая и легковесная библиотека для парсинга HTML и XML на серверной стороне Node.js. Она предоставляет разработчикам мощный jQuery-подобный синтаксис для навигации, поиска и манипуляции DOM-деревом. Если вы когда-либо работали с jQuery в браузере, то Cheerio покажется вам интуитивно понятным — Cheerio реализует подмножество jQuery, адаптированное для серверного использования.

Основные сценарии использования Cheerio:

  • Веб-скрапинг (Web Scraping): Извлечение данных с веб-страниц (цены, заголовки новостей, контент статей).
  • Тестирование: Проверка структуры HTML-шаблонов в юнит-тестах без реального браузера.
  • Препроцессинг HTML: Очистка, трансформация и извлечение частей HTML-документов перед отправкой клиенту.
  • Парсинг RSS/XML фидов: Обработка XML-документов, хотя для XML есть более специализированные инструменты.

В отличие от полноценного браузерного движка (например, Puppeteer или Playwright), Cheerio не рендерит JavaScript, не загружает CSS, изображения или внешние ресурсы. Это делает его чрезвычайно быстрым и экономным по памяти. Cheerio работает с уже готовой строкой HTML, которую вы получаете, например, через HTTP-запрос (с помощью axios, node-fetch или встроенного http/https модуля).

Установка Cheerio

Установка Cheerio в проект Node.js выполняется через менеджер пакетов npm (или yarn). Откройте терминал в корне вашего проекта и выполните:

npm install cheerio

Если вы используете yarn:

yarn add cheerio

После установки вы сможете импортировать библиотеку в свой код:

const cheerio = require('cheerio');
// или для ES-модулей:
// import * as cheerio from 'cheerio';

Обратите внимание: Cheerio — это библиотека для Node.js, и она не предназначена для работы в браузере. Если вам нужно парсить HTML на клиентской стороне, лучше использовать нативный DOMParser.

Быстрый старт: первый пример

Давайте напишем простейший скрипт, который загружает HTML-строку, находит в ней все ссылки и выводит их тексты и атрибуты href.

const cheerio = require('cheerio');

// Пример HTML-кода (обычно вы получаете его через HTTP-запрос)
const html = `
<html>
<head><title>Пример страницы</title></head>
<body>
    <h1>Добро пожаловать!</h1>
    <ul>
        <li><a href="https://example.com">Ссылка 1</a></li>
        <li><a href="https://google.com">Ссылка 2</a></li>
        <li class="special"><a href="https://github.com">Ссылка 3</a></li>
    </ul>
</body>
</html>
`;

// Загружаем HTML в Cheerio
const $ = cheerio.load(html);

// Находим все теги <a> и перебираем их
$('a').each((index, element) => {
    const text = $(element).text();       // Текст внутри тега
    const href = $(element).attr('href'); // Значение атрибута href
    console.log(`${index + 1}. ${text} - ${href}`);
});

// Результат:
// 1. Ссылка 1 - https://example.com
// 2. Ссылка 2 - https://google.com
// 3. Ссылка 3 - https://github.com

Как видите, синтаксис очень похож на jQuery: мы используем функцию $() для выборки элементов, а затем применяем методы .text(), .attr(), .each() для работы с ними.

Основные методы и функции Cheerio

Ниже приведен подробный разбор 10 ключевых методов Cheerio с описанием, параметрами и примерами.

1. cheerio.load(html, options?)

Что делает: Загружает HTML-строку и возвращает главную функцию $, через которую вы взаимодействуете с DOM. Это точка входа в библиотеку.

Параметры:

  • html (string) — HTML-код для парсинга.
  • options (object, необязательно) — объект конфигурации. Например, { xmlMode: true } для парсинга XML, { decodeEntities: false } для отключения декодирования HTML-сущностей.

Пример:

const $ = cheerio.load('<div class="content">Hello</div>');
console.log($('.content').text()); // Hello

2. $(selector, context?)

Что делает: Основная функция выборки элементов по CSS-селектору. Возвращает объект Cheerio, содержащий найденные элементы. Можно передать второй аргумент — контекст (DOM-элемент или другой объект Cheerio) для сужения поиска.

Параметры:

  • selector (string | element | Cheerio) — CSS-селектор, строка HTML, DOM-элемент или другой объект Cheerio.
  • context (element | Cheerio, необязательно) — контекст для поиска.

Пример:

const $ = cheerio.load('<ul><li class="item">1</li><li class="item active">2</li></ul>');
const items = $('li.item'); // Выбираем все <li> с классом "item"
console.log(items.length); // 2

// Поиск внутри конкретного элемента
const firstItem = $('li').first();
const activeItems = $('.active', firstItem.parent()); // Поиск .active внутри родителя первого li
console.log(activeItems.text()); // 2

3. .text(content?)

Что делает: Если вызван без аргументов — возвращает объединенный текстовый контент всех выбранных элементов (включая дочерние). Если передан аргумент — устанавливает текстовое содержимое для каждого выбранного элемента, заменяя все дочерние узлы.

Параметры:

  • content (string | number | boolean | function, необязательно) — новый текст. Если передана функция, она получает индекс и текущий текст, а возвращаемое значение становится новым текстом.

Пример:

const $ = cheerio.load('<p>Привет, <b>мир</b>!</p>');
console.log($('p').text()); // "Привет, мир!"

// Установка нового текста
$('p').text('Новый текст');
console.log($('p').html()); // "Новый текст" (тег <b> удален)

4. .html(content?)

Что делает: Без аргументов возвращает HTML-содержимое первого выбранного элемента (включая его дочерние узлы). С аргументом — заменяет HTML-содержимое всех выбранных элементов.

Параметры:

  • content (string | function, необязательно) — новый HTML-код. Если передана функция, она получает индекс и текущий HTML.

Пример:

const $ = cheerio.load('<div><span>Старый</span></div>');
console.log($('div').html()); // "<span>Старый</span>"

$('div').html('<strong>Новый</strong>');
console.log($('div').html()); // "<strong>Новый</strong>"

5. .attr(name, value?)

Что делает: Без второго аргумента возвращает значение атрибута name для первого выбранного элемента. Со вторым аргументом устанавливает значение атрибута для всех выбранных элементов. Можно передать объект для установки нескольких атрибутов.

Параметры:

  • name (string | object) — имя атрибута или объект {key: value}.
  • value (string | number | null | function, необязательно) — новое значение. Если null — удаляет атрибут.

Пример:

const $ = cheerio.load('<a href="https://site.com" data-id="123">Ссылка</a>');
console.log($('a').attr('href')); // "https://site.com"
console.log($('a').attr('data-id')); // "123"

// Установка атрибута
$('a').attr('target', '_blank');
console.log($('a').attr('target')); // "_blank"

// Удаление атрибута
$('a').attr('data-id', null);
console.log($('a').attr('data-id')); // undefined

6. .addClass(className) / .removeClass(className) / .hasClass(className)

Что делает: Управление CSS-классами. addClass добавляет один или несколько классов (через пробел). removeClass удаляет классы. hasClass проверяет наличие класса у первого элемента.

Параметры:

  • className (string) — имя класса или список классов через пробел.

Пример:

const $ = cheerio.load('<div class="box"></div>');
const div = $('div');

div.addClass('active highlighted');
console.log(div.attr('class')); // "box active highlighted"

console.log(div.hasClass('active')); // true

div.removeClass('highlighted');
console.log(div.attr('class')); // "box active"

7. .find(selector)

Что делает: Ищет элементы, соответствующие селектору, среди потомков текущего набора элементов. Очень похоже на $(selector, context), но более явное.

Параметры:

  • selector (string | Cheerio | element) — CSS-селектор.

Пример:

const $ = cheerio.load('<div class="container"><p>Текст</p><span>Спан</span></div>');
const container = $('.container');
const paragraphs = container.find('p');
console.log(paragraphs.text()); // "Текст"

8. .each(function(index, element))

Что делает: Итерирует по всем элементам в текущем наборе Cheerio. Функция обратного вызова получает индекс элемента и сам DOM-элемент (не обернутый в Cheerio). Внутри функции this ссылается на элемент, обернутый в Cheerio.

Параметры:

  • function(index, element) — функция, выполняемая для каждого элемента.

Пример:

const $ = cheerio.load('<ul><li>A</li><li>B</li><li>C</li></ul                    

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