От Simple HTML DOM до phpQuery

От Simple HTML DOM до phpQuery

Как выбрать библиотеку для парсинга на PHP.

Парсинг — это поиск и обработка данных в структурированный формат. Разработчики парсят, чтобы переносить информацию с одного сайта на другой, заполнять его контентом и подгружать данные с помощью PHP, используют сторонние библиотеки или регулярные выражения («регулярки»). Они хорошо справляются с простыми задачами — например, работа с тегами, настройка целей или фильтрация текстовой информации. Но если нужно спарсить сложный кусок HTML-кода — лучше обращаться к библиотекам.

Рассказываем об основных библиотеках для парсинга и обработки страниц на PHP.

Зачем нужен PHP

PHP (Hypertext Preprocessor) — это интерпретируемый язык программирования, который возник в 1995 году и используется до сих пор. Чаще всего — в веб-разработке. Код PHP можно сразу внедрять в HTML, но язык не ограничивается созданием сайтов. На PHP пишут скрипты, которые работают на стороне сервера (backend) и с помощью которых можно, например, принимать и отсылать cookies, создавать динамические страницы, обрабатывать и структурировать данные.

PHP подойдет новичкам. Чтобы освоить язык, можно начать с изучения систем управления контентом (CMS), которые состоят из готовых модулей и могут наполнять сайт контентом с фото и без (Wordpress) или управлять заказами и товарами (Magendo). Системы управления помогают создавать сайты без кода, но не разрешают изменять логику или дизайн ресурсов. Поэтому после CMS лучше продолжать «погружение» в PHP, изучая шаблоны описания программного продукта (MVC) и объектно-ориентированное программирование (OOP).

Ключевые PHP-библиотеки

1. Simple HTML DOM

Универсальная PHP-библиотека для парсинга HTML-кода с помощью jQuery-подобных селекторов. jQuery — это библиотека Javascript, которая позволяет создавать анимации и упрощает работу с DOM, AJAX и CSS.

Simple HTML DOM способна фильтровать вложенные элементы по отдельным секторам кода и выделять, например, комментарии. Эта библиотека имеет самое большое русскоговорящее комьюнити, автоматически выполняет все преобразования и может работать в том числе с невалидным HTML-кодом.

Пример запроса Simple HTML DOM (извлекаем все ссылки со страницы):

<?php 
require('simple_html_dom.php'); 
// Create DOM from URL or file 
$html = file_get_html('http://www.primewire.ag/watch-2805774-Star-Wars-The-Last-Jedi-online-free'); 
// Find All Movie Links 
$linkPrefix = 'http://primewire.ag'; 
$linkClass; 
foreach($html->find(".movie_version_link") as $linkClass) { 
echo "Link: ",$linkPrefix,$linkClass->find('a',0)->href,"<br/>\n"; 
} 
?>

2. phpQuery

Как и HTML DOM, phpQuery используют для парсинга HTML-кода с помощью jQuery-подобных селекторов. Эта библиотека помогает работать с HTML-строкой как с деревом DOM, но, в отличие от DOM и XPath, она не встраивается в модули PHP. phpQuery можно применять и через PHP, и через командную строку.

Пример использования:

<?php
declare(strict_types=1);
namespace Gdbots\Tests\QueryParser;
use Gdbots\QueryParser\QueryParser;
use PHPUnit\Framework\TestCase;
class QueryParserTest extends TestCase
{
protected ?QueryParser $parser = null;
public function setUp(): void
{
$this->parser = new QueryParser();
}
/**
* @dataProvider getTestQueries
*
* @param string $name
* @param string $input
* @param null   $ignored
* @param array  $expectedNodes
*/
public function testParse(string $name, string $input, $ignored, array $expectedNodes = []): void
{
$result = $this->parser->parse($input);
$this->assertEquals($expectedNodes, $result->getNodes(), "Test query [{$name}] with input [{$input}] failed.");
}
public function getTestQueries(): array
{
return require __DIR__ . '/Fixtures/test-queries.php';
}
}

}

3. htmlSQL

Это исследовательская PHP-библиотека, придуманная в 2006 году немецким разработчиком Джонасом Джоном. htmlSQL позволяет руководить HTML-разметкой с помощью SQL-подобных запросов. Это означает, что для извлечения необходимых значений вам не придется писать сложные функции или использовать «регулярки».

htmlSQL, как правило, справляется с задачами быстрее Simple HTML DOM. Но для сложных задач (например, переноса большого массива данных) функционала htmlSQL может не хватить.

Пример запроса htmlSQL:


SELECT href,title FROM a WHERE $class == "list"
       ^ Attributes    ^       ^ search query (can be empty)
         to return     ^
                       ^ HTML tag to search in
                         "*" is possible = all tags

4. DOMXPath

DOM и XPath — это не библиотеки, а встроенные модули PHP. DOM — объектная модель документа, то есть документ или его фрагмент, состоящий из XML-узлов. А XPath — синтаксис для навигации по DOM для поиска одного или нескольких узлов, расположенных в форме дерева. DOMXPath — часть расширения PHPs DOM, класс XPath из расширения PHPs DOM.

DOM и XPath считаются универсальными, но имеют требования к разметке, по которым все HTML-теги должны быть закрыты.

Пример запроса на XPath (ищем книги, написанные определенным автором):

<?php
public function getNumberOfBooksByAuthor($author)  {
    $query = "//library/book/author1/..";
    $xpath = new DOMXPath($this->domDocument);
    $result = $xpath->query($query);
    return $result->length;
}
Ещё статьи
Как системы работают с высокими нагрузками.
Зачем нужны библиотеки для векторизации.