Парсинг HTML в JavaScript (Node.js): полное руководство
Парсинг HTML — один из ключевых навыков современного веб-разработчика. В экосистеме Node.js существует несколько мощных инструментов для извлечения данных из HTML-документов. В этой статье мы подробно разберём три основные библиотеки: Cheerio, JSDOM и Puppeteer, а также научимся выбирать подходящий инструмент под конкретную задачу.
1. Cheerio — лёгкий и быстрый парсер
Cheerio — это быстрая, гибкая и лёгкая библиотека, реализующая подмножество jQuery для серверной стороны. Она идеально подходит для парсинга статического HTML, когда не требуется выполнение JavaScript на странице.
Установка
npm install cheerio
Пример использования
const cheerio = require('cheerio');
const axios = require('axios');
async function parseHTML() {
const response = await axios.get('https://example.com');
const $ = cheerio.load(response.data);
// Извлечение заголовка страницы
const title = $('title').text();
console.log('Заголовок:', title);
// Получение всех ссылок
const links = [];
$('a').each((i, el) => {
links.push($(el).attr('href'));
});
console.log('Ссылки:', links);
// Парсинг таблицы
const tableData = [];
$('table tr').each((i, row) => {
const cells = [];
$(row).find('td, th').each((j, cell) => {
cells.push($(cell).text().trim());
});
tableData.push(cells);
});
console.log('Данные таблицы:', tableData);
}
parseHTML().catch(console.error);
Преимущества Cheerio
- Высокая производительность — работает до 8 раз быстрее аналогов
- Знакомый jQuery-синтаксис
- Низкое потребление памяти
- Простая установка и настройка
Недостатки
- Не поддерживает динамический контент
- Не может выполнять JavaScript
- Не подходит для SPA-приложений
2. JSDOM — полноценная DOM-реализация
JSDOM эмулирует окружение браузера в Node.js, предоставляя полноценную реализацию DOM и HTML-парсера. В отличие от Cheerio, JSDOM может выполнять JavaScript, что делает его подходящим для парсинга страниц с динамическим контентом.
Установка
npm install jsdom
Пример использования
const { JSDOM } = require('jsdom');
const axios = require('axios');
async function parseWithJSDOM() {
const response = await axios.get('https://example.com');
const dom = new JSDOM(response.data);
const document = dom.window.document;
// Получение всех параграфов
const paragraphs = Array.from(document.querySelectorAll('p'))
.map(p => p.textContent);
console.log('Параграфы:', paragraphs);
// Работа с атрибутами
const images = Array.from(document.querySelectorAll('img'))
.map(img => ({
src: img.getAttribute('src'),
alt: img.getAttribute('alt')
}));
console.log('Изображения:', images);
// Выполнение скриптов (осторожно!)
const { window } = new JSDOM(`<body>
<script>
document.body.innerHTML += '<p>Динамический контент</p>';
</script>
</body>`, { runScripts: 'dangerously' });
console.log(window.document.body.innerHTML);
}
parseWithJSDOM().catch(console.error);
Преимущества JSDOM
- Полная поддержка DOM API
- Возможность выполнения JavaScript
- Поддержка современных веб-стандартов
- Совместимость с браузерными библиотеками
Недостатки
- Более медленный по сравнению с Cheerio
- Потребляет больше памяти
- Сложнее в настройке
3. Puppeteer — браузерная автоматизация
Puppeteer — это библиотека для управления браузером Chrome/Chromium через DevTools Protocol. Она позволяет парсить страницы, которые требуют полной эмуляции браузера, включая выполнение сложных JavaScript-скриптов и обработку AJAX-запросов.
Установка
npm install puppeteer
Пример использования
const puppeteer = require('puppeteer');
async function