Cheerio — это один из самых быстрых html DOM парсеров вообще, и самый быстрый парсер на платформе node.js. Он создаёт DOM-дерево страницы, и предоставляет удобный jQuery-like интерфейс для работы с этим деревом.

Страница на github, страница на nodejsmodules. Устанавливается командой npm install cheerio.

Простой пример работы с ним (понадобится модуль request для загрузки страниц):

var request = require('request'), cheerio = require('cheerio');

//Загружаем страницу
request({uri:'http://www.amazon.com/', method:'GET', encoding:'binary'},
    function (err, res, page) {
        //Передаём страницу в cheerio
        var $=cheerio.load(page);
        //Идём по DOM-дереву обычными CSS-селекторами
        img_src=$('div.s9a3 > div > div > a > div > div > img').attr("src");
        console.log(img_src);
    });

Вся навигация производится CSS-селекторами, однако есть возможность использования XPath для более удобного выбора. К слову сказать, приведённый пример выполняется довольно быстро: я проводил бенчмарк на процессоре Atom 330, и при 100 прогонах теста один прогон занимал ровно 100 миллисекунд. Приемлемая скорость, особенно если учесть что страница amazon.com немаленькая, и мы делаем довольно сложный вложенный запрос.

Видимо, модуль использует JiT-компиляцию, хранение вычисленных значений, какой-то кеш и прочие плюшки динамического программирования, а так же следит за использованием памяти — поэтому с ростом числа циклов время выполнения сокращается: 1 прогон — 770 мс, 10 прогонов — 170 мс, 100 — 100 мс, 1000 — 90 мс.

После выбора элемента можно что-то с ним сделать — прочитать его html-код либо какой-то отдельный атрибут, найти его детей или соседей, а также добавить/убрать классы. Всё это реализовано в cheerio:

.attr() — стандартный синтаксис attr, как в jQuery:

$().attr(prop) = val или $().attr(prop, val) устанавливает свойству prop значение val; val = $().attr(prop) читает значение свойства prop в переменную val. Установку свойств можно комбинировать: $().attr({prop1: val1, prop2: val2}).

Дополнительно функция $().attr(prop, val) возвращает сам этот элемент, можно тут же прочитать, например, его html-код: elem_html = $().attr(prop, val).html();

.html() возвращает html-код, а .html(‘some html code’) заменяет содержимое элемента DOM-дерева переданным кодом.

.data() возвращает объект с перечнем всех свойств элемента, а .data(prop) — значение конкретного свойства.

.addClass() и .removeClass() работают полностью как в jQuery — добавляют и удаляют указанный класс к элементу.

.next() и .prev() возвращают соседей — предыдущий и следующий элементы дерева.