Парсинг HTML-страниц

Возникает необходимость вытащить с какой-нибудь страницы HTML какой-нибудь тэг или класс. На помощь может прийти стандартный HTML-класс DOMDocument

$dom = new DOMDocument;
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');
 
foreach ($images as $image) {
        $image->setAttribute('src', 'http://example.com/' . $image->getAttribute('src'));
}
 
$html = $dom->saveHTML();

Но работает он крайне нестабильно, хотя бы по причине того, что не совсем корректно отрабатывает, если в дереве тэги закрыты не все.
Поэтому можно воспользоваться достаточно простой для использования библиотеки Simple HTML DOM
Эта библиотека позволяет парсить страницу используя многим привычные jQuery-селекторы. Эта библиотека умеет фильтровать элементы, искать вложенные и обращаться к их атрибутам, а также она адекватно работает с не совсем корректным HTML-кодом и проблемы с кодировкой у неё особых нет.

Мне нужно было найти все изображения на странице и вывести их на экран, код для подобного есть в примерах на сайте, поэтому тут все просто

$html = str_get_html($url);
$images = $html->find('img');
foreach ($images as $image) {
  echo '<img src='.$image-src.'>';
}

Вот пример от создателей. В этом примере сначала подгружается, а потом модифицируется заранее заготовленный HTML-код: во второй строке происходит добавление атрибута class со значением bar первом попавшемуся элементу div, а в следующей строке мы заменяем текст элемента с id=”world” на foo.

$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.