Метод links класса Crawler
Метод links класса Crawler возвращает
массив объектов Link, которые представляют
собой ссылки a, найденные в текущем
наборе узлов DOM-документа. Метод не принимает
параметров и возвращает только те ссылки, которые
расположены внутри узлов, содержащихся в объекте
Crawler.
Каждый элемент возвращаемого массива является
экземпляром класса Symfony\Component\DomCrawler\Link
и содержит URI, текст ссылки и метод HTTP-запроса.
Синтаксис
public function links(): array
Пример
Давайте получим все ссылки из HTML-документа и выведем их тексты:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$html = '<div>
<a href="/user">user</a>
<a href="/article">article</a>
<a href="/hello">hello</a>
</div>';
$crawler = new Crawler($html);
$links = $crawler->filter('div')->links();
$res = [];
foreach ($links as $link) {
$res[] = $link->getNode()->nodeValue;
}
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["user", "article", "hello"]
Пример
Давайте получим адреса всех ссылок через метод
getUri объекта Link:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/links', name: 'article_links')]
public function links(): Response
{
$html = '<nav>
<a href="/user">user</a>
<a href="/article/1">article 1</a>
<a href="/article/2">article 2</a>
</nav>';
$crawler = new Crawler($html, 'http://example.com');
$links = $crawler->filter('nav')->links();
$res = [];
foreach ($links as $link) {
$res[] = $link->getUri();
}
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["http://example.com/user", "http://example.com/article/1", "http://example.com/article/2"]
Пример
Давайте извлечём ссылки вместе с их текстом и адресом:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/extract', name: 'article_extract')]
public function extract(): Response
{
$html = '<ul>
<li><a href="/user/1">user 1</a></li>
<li><a href="/user/2">user 2</a></li>
</ul>';
$crawler = new Crawler($html, 'http://example.com');
$links = $crawler->filter('ul')->links();
$res = [];
foreach ($links as $link) {
$res[] = [
'text' => $link->getNode()->nodeValue,
'uri' => $link->getUri(),
];
}
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"text": "user 1", "uri": "http://example.com/user/1"}, {"text": "user 2", "uri": "http://example.com/user/2"}]
Пример
Давайте выведем HTTP-метод каждой найденной ссылки:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/methods', name: 'article_methods')]
public function methods(): Response
{
$html = '<div>
<a href="/article">article</a>
<a href="/hello">hello</a>
</div>';
$crawler = new Crawler($html, 'http://example.com');
$links = $crawler->filter('div')->links();
$res = [];
foreach ($links as $link) {
$res[] = $link->getMethod();
}
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
["GET", "GET"]
Смотрите также
-
класс
Crawler,
который представляет DOM-документ для парсинга -
метод
filter,
который выбирает узлы по CSS-селектору -
метод
images,
который извлекает изображения из документа -
метод
selectLink,
который выбирает конкретную ссылку по тексту