Парсер сайтов и контента - phpQuery | Wiki | PWODEV
, 02.01.2018 17:19

Парсер сайтов и контента — phpQuery


Сегодня поговорим о том как сделать парсер сайтов на php или html tag parser. Задача получить контент сайта с помощью php, а дальше из полученного контента вытащить содержимое какого-либо тега или class или id. Например jQuery это хороший парсер контента. Тоесть чтобы получить какой-то элемент страницы достаточно знать только селектор этого элемента. Вообщем нам нужен такой же парсер контента сайтов как jQuery но на php.

Для реализации этого есть php класс DOMDocument. Этот  класс php парсит html код как делает это обычный Javascript. Но чтобы упростить пользование класса DOMDocument есть библиотека phpQuery это аналог jQuery но на php.

Ссылка phpQuery на Google Code

Задание думаю понятно, теперь приступим к реализации php парсера.

Парсер сайтов на phpQuery.

Для начала скачиваем последнюю версию плагина phpQuery по этой ссылке или из репозитория. Кладем файл в нужную директорию (в нашем случае в корень сайта). И подключаем библиотеку которая поможет нам парсить контент сайта.

include_once 'phpQuery.php';

Итак библиотеку мы подключили. Теперь нам нужны демо данные. Для этого записываем в php переменную html код.

Статья как записать в php переменную html код.

$html = <<<CONTENT
<div class="test">
 <h1>Title</h1>
 <div class="content">Content</div>
</div>
CONTENT;

Демо данные у нас есть. Мы сохранили их в переменную $html. Наша задача получить содержимое .content

Другой вариант можно также получить контент сайта по URL для того чтобы сделать парсер php функцией file_get_contents:

$html = file_get_contents('http://wiki.pwodev.com/');

Добавляем демо данные или контент сайта в обьект модуля:

$document = phpQuery::newDocument($html);

Теперь нам нужно парсить html код по тегу. Парсим контент следующей функцией:

$echo = $document->find('.content');

Селектор такой же как и в jQuery или как в css. Все довольно просто. Теперь чтобы вывести полученное содержимое достаточно написать:

echo $echo;

Если нам нужно вернуть html код этого класса а не вывести на экран используем следующий метод: $echo->htmlOuter();

var_dump($echo->htmlOuter());

/* RESULT
string(34) "
<div class="content">Content</div>
" 
*/

$echo->html(); — вернет содержимое без родительского искомого класса. То есть без «<div class=»content»></div>»

$echo->getString(); — вернет массив текста без тегов.

Полный список методов есть в официальной документации этой библиотеки.

Полный код сегодняшнего урока:

<?php
include_once 'phpQuery.php';

$html = <<<CONTENT
<div class="test">
 <h1>Title</h1>
 <div class="content">Content</div>
</div>
CONTENT;

$document = phpQuery::newDocument($html);
$echo = $document->find('.content');

var_dump($echo->html());

Еще один пример использования:

<?php
include_once 'phpQuery.php';

$html = file_get_contents('http://wiki.pwodev.com');

$document = phpQuery::newDocument($html);

$echo_elements = $document->find('.post .title');

foreach ($echo_elements as $el) {
 $pq = pq($el); // Это аналог $ в jQuery

 $old_title = $pq->find('a')->getString()[0];
 $pq->find('a')->attr('href', 'http://wiki.pwodev.com/')->html('New title. Old - '.$old_title); // меняем атрибуты найденого элемента и контент

 $pq->find('div.remove_element')->remove(); // удаляем ненужный элемент

 $pq->find('a')->prepend('<span>Title: </span>'); // добавляем контент в начало
 $pq->append('<p>Next element</p>'); // добавляем контент в конец
}

var_dump($echo_elements->html());

На этом пока все. Надеюсь всем было интересно и познавательно. Если кто-то хочет дополнить статью пишите в комментарии. Также добро пожаловать к нам в сообщество.


Добавить комментарий