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