Краулер DOM

Дата оновлення перекладу 2022-11-24

Краулер DOM

Екземпляр Краулеру повертається кожний раз, коли ви робите запит з Клієнтом. Він дозволяє вам траверсувати документи HTML або XML: обирати вузли, знаходити посилання та форми і вилучати атрибути або зміст.

Траверсування

Як і jQuery, краулер має методи траверсування DOM документу HTML/XML. Наприклад, наступне знайде всі елементи input[type=submit], обере останній на сторінці, а потім обере його найближчий батьківський елемент:

1
2
3
4
5
$newCrawler = $crawler->filter('input[type=submit]')
    ->last()
    ->parents()
    ->first()
;

Доступні також багато інших методів:

filter('h1.title')
Вузли, що співпадають з селектором CSS.
filterXpath('h1')
Вузли, що співпадають з виразом XPath.
eq(1)
Вузол для вказаного індексу.
first()
Перший вузол.
last()
Останній вузол.
siblings()
Сіблінги.
nextAll()
Всі наступні сіблінги.
previousAll()
Всі попередні сіблінги.
parents()
Повертає батьківські вузли.
children()
Повертає дочірні вузли.
reduce($lambda)
Вузли, для яких викличне не повертає false.

Так як кожний з цих методів повертає новий екземпляр Crawler, ви можете звузити ваш вибір вузлів, створивши ланцюжок викликів методів:

1
2
3
4
5
6
7
8
9
$crawler
    ->filter('h1')
    ->reduce(function ($node, $i) {
        if (!$node->attr('class')) {
            return false;
        }
    })
    ->first()
;

Tip

Використайте функцію count(), щоб отримати кількість вузлів, що зберігаються у краулері: count($crawler)

Вилучення інформації

Краулер може вилучати інформацію з вузлів:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// повертає значення атрибуту першого вузла
$crawler->attr('class');

// повертає значення вузла першого вузла
$crawler->text();

// повертає текст за замовчуванням, якщо вузол не існує
$crawler->text('Default text content');

// передає TRUE в якості другого аргументу text(), щоб видалити всі зайві пробіли, включно
// з внутрішніми (наприклад, "  foo\n  bar    baz \n " повертається як "foo bar baz")
$crawler->text(null, true);

// вилучає масив атрибутів для всіх вузлів
// (_text повертає значення вузла)
// повертає масив для кожного елементу у краулері,
// кожний зі значенням та href
$info = $crawler->extract(['_text', 'href']);

// виконує лямбду для кожного вузла і повертає масив результатів
$data = $crawler->each(function ($node, $i) {
    return $node->attr('href');
});