Метод extract класса Crawler
Метод extract класса Crawler извлекает
данные из выбранных DOM-узлов в виде массива. Первым
параметром передаётся массив правил извлечения, где
ключ задаёт имя поля результата, а значение - правило
(селектор или массив с селектором и атрибутом).
Вторым параметром можно передать callback-функцию
для постобработки каждого извлечённого значения.
Синтаксис
extract(array $rules, ?callable $callback = null): array
Пример
Давайте извлечём заголовок и текст статьи из HTML:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentDomCrawlerCrawler;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<div class="article">'
. '<h1>article 1</h1>'
. '<p>hello</p>'
. '</div>';
$crawler = new Crawler($html);
$res = $crawler->filter('.article')->extract([
'title' => 'h1',
'body' => 'p',
]);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
{"title":"article 1","body":"hello"}
Пример
Давайте извлечём значение атрибута, передав массив из селектора и имени атрибута:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentDomCrawlerCrawler;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<a href="/user" class="link">abcde</a>';
$crawler = new Crawler($html);
$res = $crawler->filter('.link')->extract([
'url' => ['a', 'href'],
]);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
{"url":"/user"}
Пример
Давайте обработаем извлечённые значения через callback-функцию:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentDomCrawlerCrawler;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(): Response
{
$html = '<div class="article">'
. '<h1>article 1</h1>'
. '</div>';
$crawler = new Crawler($html);
$res = $crawler->filter('.article')->extract(
['title' => 'h1'],
function (string $value): string {
return strtoupper($value);
}
);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
{"title":"ARTICLE 1"}