Краулер DOM

Дата обновления перевода 2021-09-29

Краулер 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');
});