Парсинг HTML в PHP: обзор библиотек и инструментов
Парсинг HTML — одна из частых задач веб-разработчика. Будь то извлечение данных с чужого сайта (скрапинг), анализ собственных страниц или автоматизация тестирования — без надёжного инструмента не обойтись. PHP, как серверный язык, предоставляет несколько способов работы с HTML-кодом. В этой статье мы разберём три самые популярные библиотеки: PHP Simple HTML DOM Parser, DiDOM и Symfony DomCrawler. Вы узнаете их возможности, сильные и слабые стороны, а также увидите примеры кода.
Зачем нужен парсинг HTML?
Встроенные функции PHP (file_get_contents, preg_match) слишком примитивны для сложных задач. Регулярные выражения быстро становятся громоздкими и ломаются при малейшем изменении структуры HTML. Специализированные библиотеки позволяют:
- Обращаться к элементам через CSS-селекторы или XPath;
- Обходить DOM-дерево как в JavaScript;
- Извлекать текст, атрибуты, ссылки;
- Модифицировать HTML и сохранять результат.
1. PHP Simple HTML DOM Parser
Одна из старейших и самых известных библиотек. Работает без внешних зависимостей, подходит для PHP 5.6+. Её главное преимущество — интуитивный синтаксис, напоминающий jQuery.
Установка
// Скачайте файл simple_html_dom.php с GitHub
require_once 'simple_html_dom.php';
Пример использования
// Создаём объект DOM из URL
$html = file_get_html('https://example.com');
// Находим все ссылки
foreach($html->find('a') as $link) {
echo $link->href . ' - ' . $link->plaintext . "\n";
}
// Извлекаем заголовок h1
$h1 = $html->find('h1', 0);
echo $h1 ? $h1->plaintext : 'Заголовок не найден';
// Очищаем память
$html->clear();
Плюсы и минусы
- + Простота и понятный API;
- + Не требует Composer;
- - Медленная работа с большими документами;
- - Проект давно не обновлялся;
- - Не поддерживает современные стандарты PHP 8.x полностью.
2. DiDOM
Современная библиотека, активно поддерживаемая сообществом. Полностью совместима с PHP 7.4–8.3. Использует CSS-селекторы и XPath, работает в разы быстрее Simple HTML DOM.
Установка через Composer
composer require imangazaliev/didom
Пример использования
use DiDom\Document;
$document = new Document('https://example.com', true);
// Поиск всех ссылок
$links = $document->find('a');
foreach ($links as $link) {
echo $link->attr('href') . "\n";
}
// Поиск по классу
$items = $document->find('.product-title');
foreach ($items as $item) {
echo $item->text() . "\n";
}
// Извлечение первого элемента
$firstTitle = $document->first('h2');
echo $firstTitle ? $firstTitle->text() : 'Нет заголовков';
Плюсы и минусы
- + Высокая производительность;
- + Поддержка CSS-селекторов любой сложности;
- + Работа с кодировками;
- - Требует Composer;
- - Документация на русском есть, но фрагментарна.
3. Symfony DomCrawler
Часть экосистемы Symfony, но может использоваться как самостоятельная библиотека. Предоставляет мощный API для навигации по DOM, извлечения данных и работы с формами.
Установка
composer require symfony/dom-crawler
composer require symfony/css-selector // для CSS-селекторов
Пример использования
use Symfony\Component\DomCrawler\Crawler;
$html = file_get_contents('https://example.com');
$crawler = new Crawler($html);
// Извлечение заголовков h2
$crawler->filter('h2')->each(function ($node) {
echo $node->text() . "\n";
});
// Получение всех ссылок и их текстов
$links = $crawler->filter('a')->extract(['href', '_text']);
foreach ($links as $link) {
echo "