Селекторы, которые вы предоставляете методу filter()
(для $intro
и $date
), ничего не указывают в дереве DOM документа.
Прежде всего, небольшая точностьо тех цепочечных селекторах, которые вы придумали:
$intr = 'body > div:nth-child(3) > ...';
На всякий случай, если вы не знаете, нет необходимости начинать с корневого узла (тега body
), чтобы найти элемент. Например, если бы я хотел получить элемент (ы) .myDiv
, я мог бы просто сделать следующее:
$crawler->filter('.myDiv');
Парсеры DOM также существуют, чтобы избежать боли при обходе всех узлов, чтобы найтиконкретные или несколько элементов, где бы они ни находились в дереве.
Для большей простоты старайтесь как можно меньше полагаться на HTML-теги при поиске узла и по возможности использовать селекторы классов CSS.
Рабочий пример:
$subCrawler = $client->request('GET', 'https://www.morningbrew.com/daily/2019/11/07');
$date = $subCrawler->filter('.pcard')
->filter('table:first-child')
->filter('td:first-child')
->text();
$text = $subCrawler->filter('.pcard')
->filter('table:nth-child(4)')
->text();
Примечания:
Поскольку мы ожидаем только один узел, выполнять итерации не нужнос помощью each()
для извлечения содержимого узла
filter()
вызовы объединены здесь для большей читаемости, но это вопрос предпочтений. Также допустимо объединение всех селекторов в один.