РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1169 of 1361 menu

Метод each класса Crawler

Метод each класса Crawler перебирает все узлы, найденные в DOM-дереве, и для каждого узла вызывает переданную callback-функцию. Первым параметром передаётся замыкание, которое получает узел DOMNode, его позицию i и объект Crawler. Метод возвращает массив результатов, собранных из возвращаемых значений callback.

Синтаксис

$crawler->each(function (DOMNode $node, int $i, Crawler $crawler) { // ... });

Пример

Давайте переберём все ссылки на странице и соберём их адреса в массив:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\DomCrawler\Crawler; use DOMNode; class ArticleController extends AbstractController { public function index(): Response { $html = ' <a href="/user">user</a> <a href="/article">article</a> <a href="/hello">hello</a> '; $crawler = new Crawler($html); $res = $crawler->filter('a')->each(function (DOMNode $node, int $i, Crawler $crawler) { return $node->getAttribute('href'); }); return new Response(json_encode($res)); } } ?>

Результат выполнения кода:

["/user","/article","/hello"]

Пример

Давайте соберём текст каждого абзаца вместе с его порядковым номером:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\DomCrawler\Crawler; use DOMNode; class ArticleController extends AbstractController { public function index(): Response { $html = ' <p>abcde</p> <p>article</p> <p>hello</p> '; $crawler = new Crawler($html); $res = $crawler->filter('p')->each(function (DOMNode $node, int $i, Crawler $crawler) { return $i . ':' . $node->textContent; }); return new Response(json_encode($res)); } } ?>

Результат выполнения кода:

["0:abcde","1:article","2:hello"]

Пример

Давайте соберём массив сущностей из строк таблицы:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\DomCrawler\Crawler; use DOMNode; class ArticleController extends AbstractController { public function index(): Response { $html = ' <tr> <td>article</td> <td>text</td> <td>1</td> <td>true</td> </tr> '; $crawler = new Crawler($html); $res = $crawler->filter('tr')->each(function (DOMNode $node, int $i, Crawler $crawler) { return [ 'title' => $crawler->filter('td')->eq(0)->text(), 'body' => $crawler->filter('td')->eq(1)->text(), 'count' => (int) $crawler->filter('td')->eq(2)->text(), 'active' => (bool) $crawler->filter('td')->eq(3)->text(), ]; }); return new Response(json_encode($res)); } } ?>

Результат выполнения кода:

[{"title":"article","body":"text","count":1,"active":true}]

Смотрите также

  • метод filter,
    который фильтрует узлы по CSS-селектору
  • метод reduce,
    который сворачивает узлы в одно значение
  • метод text,
    который возвращает текст первого узла
  • класс Crawler,
    который предоставляет API для обхода DOM-дерева
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить