Класс Crawler
Класс Crawler из компонента Symfony DomCrawler
предназначен для парсинга HTML и XML документов.
Он позволяет перемещаться по DOM-дереву, фильтровать
узлы с помощью CSS-селекторов или XPath-выражений
и извлекать текст, атрибуты и HTML-содержимое элементов.
Конструктор принимает массив узлов DOM или строку с HTML.
Синтаксис
use Symfony\Component\DomCrawler\Crawler;
$crawler = new Crawler($html, $uri);
Пример
Давайте создадим объект Crawler и отфильтруем
все ссылки из HTML-строки:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<a href="/page1">article</a><a href="/page2">user</a>';
$crawler = new Crawler($html);
$links = $crawler->filter('a')->each(function (Crawler $node) {
return $node->attr('href');
});
return new Response(json_encode($links));
}
}
?>
Результат выполнения кода:
["/page1", "/page2"]
Пример
Давайте извлечём текст из нескольких параграфов:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<p>hello</p><p>abcde</p><p>article</p>';
$crawler = new Crawler($html);
$text = $crawler->filter('p')->each(function (Crawler $node) {
return $node->text();
});
return new Response(json_encode($text));
}
}
?>
Результат выполнения кода:
["hello", "abcde", "article"]
Пример
Давайте используем XPath-выражение для поиска элементов с определённым атрибутом:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<div class="item">hello</div><div class="item">abcde</div>';
$crawler = new Crawler($html);
$res = $crawler->filterXPath('//div[@class="item"]')->each(function (Crawler $node) {
return $node->text();
});
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["hello", "abcde"]
Смотрите также
-
метод
filter,
который фильтрует узлы по CSS-селектору -
метод
filterXPath,
который фильтрует узлы по XPath-выражению -
метод
text,
который возвращает текст узла -
метод
attr,
который возвращает значение атрибута узла