DiDOM - простая и быстрая библиотека для парсинга HTML.
- Установка
- Быстрый старт
- Создание нового документа
- Поиск элементов
- Проверка наличия элемента
- Вывод содержимого
- Создание нового элемента
- Работа с атрибутами элемента
- Сравнение с другими парсерами
Для установки DiDOM выполните команду:
composer require imangazaliev/didom
use DiDom\Document;
$document = new Document('http://www.news.com/', true);
$posts = $document->find('.post');
foreach($posts as $post) {
echo $post->text(), "\n";
}DiDom позволяет загрузить HTML несколькими способами:
//в первом параметре передается строка с HTML
$document = new Document($html);
//путь к файлу
$document = new Document('page.html', true);
//или URL
$document = new Document('http://www.example.com/', true);Второй параметр указывает на то, что загружается файл. По умолчанию - false.
$document = new Document();
$document->loadHtml($html);
$document->loadHtmlFile('page.html');
$document->loadHtmlFile('http://www.example.com/');В качестве выражения для можно передать CSS-селектор или XPath-путь. Для этого в первом параметре нужно передать само выражение, а во втором - его тип (по умолчанию - Query::TYPE_CSS):
use DiDom\Document;
use DiDom\Query;
...
//CSS-селектор
$posts = $document->find('.post');
//XPath-путь
$posts = $document->find("//div[contains(@class, 'post')]", Query::TYPE_XPATH);$posts = $document('.post');$posts = $document->xpath("//*[contains(concat(' ', normalize-space(@class), ' '), ' post ')]");Можно осуществлять поиск и внутри элемента:
echo $document->find('.post')[0]->find('h2')[0]->text();Если элементы, соответствующие заданному выражению, найдены, вернется массив с экземплярами DiDom\Element, иначе - пустой массив.
Проверить наличие элемента можно с помощью метода has():
if ($document->has('.post')) {
//код
}Если нужно проверить наличие элемента, а затем получить его, то можно сделать так:
if ($document->has('.post')) {
$elements = $document->find('.post');
//код
}но быстрее так:
if (count($elements = $document->find('.post')) != 0) {
//код
}т.к. в первом случае выполняется два запроса.
$posts = $document->find('.post');
echo $posts[0]->html();$html = (string) $posts[0];$posts = $document->find('.post');
echo $posts[0]->text();use DiDom\Element;
$element = new Element('span', 'Hello');
// Выведет "<span>Hello</span>"
echo $element->html();Первым параметром передается название элемента, вторым - его значение (необязательно).
$name = $element->tag;$element->setAttribute('name', 'username');$element->attr('name', 'username');$element->name = 'username';$username = $element->getAttribute('value');$username = $element->attr('value');$element->name = 'username';Если атрибут не найден, вернет null.
if ($element->hasAttribute('name')) {
//код
}if (isset($element->name)) {
//код
}$element->removeAttribute('name');unset($element->name);Кэш - массив XPath-выражений, полученных из CSS.
use DiDom\Document;
use DiDom\Query;
...
$xpath = Query::compile('h2');
//array('h2' => '//h2')
$compiled = Query::getCompiled();Query::setCompiled(['h2' => '//h2']);