Парсинг HTML в PHP: DOMDocument, SimpleXML и cURL для веб-скрапинга

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

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

Начать курс

Парсинг HTML в PHP: Полное руководство по извлечению данных с веб-страниц

Парсинг HTML — одна из ключевых задач веб-разработки, позволяющая автоматически извлекать структурированные данные с веб-страниц. PHP предлагает мощные встроенные инструменты для этой цели, включая расширения DOMDocument и SimpleXML, а также библиотеку cURL для работы с HTTP-запросами. В этой статье мы подробно разберём, как парсить HTML в PHP, рассмотрим лучшие практики, обработку ошибок и примеры кода.

Основные инструменты парсинга HTML в PHP

Для парсинга HTML в PHP используются следующие основные компоненты:

  • DOMDocument — встроенный класс для работы с DOM-деревом HTML/XML. Позволяет загружать, модифицировать и извлекать элементы.
  • DOMXPath — расширение для DOMDocument, позволяющее выполнять запросы XPath для точного поиска узлов.
  • SimpleXML — упрощённое расширение для работы с XML, но может использоваться и для HTML при условии корректной структуры.
  • cURL — библиотека для выполнения HTTP-запросов, необходимая для получения HTML-кода удалённых страниц.

Пошаговый пример парсинга HTML с помощью DOMDocument

Рассмотрим полный пример парсинга HTML-страницы. Предположим, нам нужно извлечь заголовки статей (теги <h2>) и ссылки (<a>) с сайта.

<?php
// 1. Получаем HTML-код страницы с помощью cURL
$url = 'https://example.com/articles';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
$html = curl_exec($ch);
if (curl_errno($ch)) {
    die('Ошибка cURL: ' . curl_error($ch));
}
curl_close($ch);

// 2. Создаём объект DOMDocument и загружаем HTML
$dom = new DOMDocument();
libxml_use_internal_errors(true); // Подавляем ошибки парсинга невалидного HTML
$dom->loadHTML($html);
libxml_clear_errors();

// 3. Создаём объект DOMXPath для удобного поиска
$xpath = new DOMXPath($dom);

// 4. Извлекаем все заголовки h2
$headings = $xpath->query('//h2');
echo "<h3>Заголовки статей:</h3>";
foreach ($headings as $heading) {
    echo "<p>" . htmlspecialchars($heading->nodeValue) . "</p>";
}

// 5. Извлекаем все ссылки с классом 'article-link'
$links = $xpath->query('//a[@class="article-link"]');
echo "<h3>Ссылки на статьи:</h3>";
foreach ($links as $link) {
    $href = $link->getAttribute('href');
    $text = $link->nodeValue;
    echo "<p><a href='" . htmlspecialchars($href) . "'>" . htmlspecialchars($text) . "</a></p>";
}
?>

Использование SimpleXML для простых случаев

SimpleXML удобен для парсинга хорошо структурированных HTML-документов, но не справляется с невалидным HTML. Пример извлечения данных из таблицы:

<?php
$html = '<table><tr><td>Ячейка 1</td><td>Ячейка 2</td></tr></table>';
$xml = simplexml_load_string($html);
if ($xml === false) {
    echo "Ошибка загрузки HTML";
} else {
    foreach ($xml->tr->td as $cell) {
        echo "Данные: " . htmlspecialchars($cell) . "<br>";
    }
}
?>

Обработка ошибок и лучшие практики

При парсинге HTML в PHP важно учитывать следующие моменты:

  • Подавление ошибок: Используйте libxml_use_internal_errors(true) перед загрузкой HTML, чтобы избежать вывода предупреждений о невалидной разметке.
  • Кодировка: Убедитесь, что HTML загружается в правильной кодировке (UTF-8). При необходимости используйте mb_convert_encoding().
  • User-Agent: Всегда устанавливайте корректный User-Agent в cURL, чтобы не быть заблокированным сервером.

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