В этой статье вы прочитаете про PHP библиотеку DiDOM, для быстрого парсинга HTML страниц, но стоит сказать, что это только быстры старт работы с ней, а не полное руководство.
Также если вас интересует PHP, то можете почитать статью «Роутинг на языке PHP», тоже возможно будет вам интересно.
PHP DiDOM быстрый старт:
Для начала нужно скачать, для этого нам нужен composer, ведите вот эту команду:
1 | composer require imangazaliev/didom |
Использование:
Давайте покажу вам не большой пример, и вы убедитесь что с помощью очень легко:
1 2 3 4 5 6 7 8 9 | use DiDom\Document; $document = new Document('http://www.news.com/', true); $posts = $document->find('.post'); foreach($posts as $post) { echo $post->text(), "\n"; } |
Здесь всё очень просто, мы получаем страницу «http://www.news.com/» и делаем поиск всех элементов с селектором .post
, в итоге мы получаем массив с элементами, последние что мы делаем это проходимся циклом по массиву и выводим текст поста.
Загрузка HTML:
DiDom позволяет загружать HTML несколькими способами:
1 2 3 4 5 6 7 8 | // Первый вариант вы можете отправить строку $document = new Document($html); // Файл на компьютере $document = new Document('page.html', true); // Или URL $document = new Document('http://www.example.com/', true); |
Второй параметр указывает, нужно ли загружать файл. По умолчанию — false.
Атрибуты:
1 | __construct($string = null, $isFile = false, $encoding = 'UTF-8', $type = Document::TYPE_HTML) |
- $string — строка HTML или XML или путь к файлу.
- $isFile — указывает, что первый параметр — это путь к файлу.
- $encoding — кодировка документа.
- $type — тип документа (HTML — Document :: TYPE_HTML, XML — Document :: TYPE_XML).
Отдельные методы:
1 2 3 4 5 6 7 | $document = new Document(); $document->loadHtml($html); $document->loadHtmlFile('page.html'); $document->loadHtmlFile('http://www.example.com/'); |
Для загрузки XML доступны два метода: loadXml()
и loadXmlFile()
.
Эти методы принимают дополнительные параметры:
1 2 3 4 5 | $document->loadHtml($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $document->loadHtmlFile($url, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $document->loadXml($xml, LIBXML_PARSEHUGE); $document->loadXmlFile($url, LIBXML_PARSEHUGE); |
Поиск элементов:
DiDOM принимает селектор CSS или XPath в качестве выражения для поиска. Вам нужно указать выражение пути в качестве первого параметра и указать его тип во втором (тип по умолчанию — Query::TYPE_CSS
):
1 2 3 4 5 6 7 8 9 10 | se DiDom\Document; use DiDom\Query; ... // CSS селектор $posts = $document->find('.post'); // XPath $posts = $document->find("//div[contains(@class, 'post')]", Query::TYPE_XPATH); |
Если найдены элементы, соответствующие заданному выражению, метод возвращает массив экземпляров DiDom\Element
, иначе — пустой массив. Вы также можете получить массив объектов DOMElement. Чтобы получить это, передайте false
в качестве третьего параметра.
С помощью магического метода __invoke()
:
1 | $posts = $document('.post'); |
Предупреждение: использовать этот метод нежелательно, так как он может быть удален в будущем.
С помощью метода xpath()
:
1 | $posts = $document->xpath("//*[contains(concat(' ', normalize-space(@class), ' '), ' post ')]"); |
Вы можете выполнять поиск внутри элемента:
1 | echo $document->find('nav')[0]->first('ul.menu')->xpath('//li')[0]->text(); |
Проверить, существует ли элемент:
Чтобы проверить, существует ли элемент, используйте метод has()
:
1 2 3 | if ($document->has('.post')) { // Код } |
Если вам нужно проверить, существует ли элемент, а затем получить его:
1 2 3 4 | if ($document->has('.post')) { $elements = $document->find('.post'); // Код } |
Но было бы быстрее вот так:
1 2 3 | if (count($elements = $document->find('.post')) > 0) { // Код } |
Потому что в первом случае он делает два запроса.
Искать в документе:
Методы find()
, first()
, xpath()
, has()
, count()
также доступны в Element.
Пример:
1 | echo $document->find('nav')[0]->first('ul.menu')->xpath('//li')[0]->text(); |
Метод findInDocument()
:
Если вы измените, замените или удалите элемент, который был найден в другом элементе, документ не будет изменен. Это происходит потому, что метод find()
класса Element
(соответственно методы first()
и xpath()
) создает новый документ для поиска.
Для поиска элементов в исходном документе необходимо использовать методы findInDocument()
и firstInDocument()
:
1 2 3 4 5 | // Ничего не случится $document->first('head')->first('title')->remove(); // Но тут всё сработает $document->first('head')->firstInDocument('title')->remove(); |
Предупреждение: методы findInDocument()
и firstInDocument()
работают только для элементов, принадлежащих документу, и для элементов, созданных с помощью new Element(...)
. Если элемент не принадлежит документу, будет выброшено исключение LogicException
;
Вывод:
В этой статье вы прочитали про PHP библиотеку DiDOM для парсинга страниц, думаю вам было интересно и полезно, но стоит сказать, что по сути эта статья не большая часть официальной документации на GitHub, поэтому если надо узнать о ней поподробнее, то заходите на неё и читайте.