Emtpy возврат по ссылке, используя goutte - PullRequest
1 голос
/ 07 ноября 2019

Я бегу PHP 7.3.5 и "fabpot/goutte": "^3.2".

Я пытаюсь почистить введение и дату по ссылке, однако я ничего не получаю взамен.

Найтиниже моего минимального жизнеспособного примера:

<?php
require_once 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

$url = 'body > div.container > div > div > ul.list-group.mb-5 > a';
$intr = 'body > div:nth-child(3) > div:nth-child(2) > div > table:nth-child(10) > tbody > tr > td > div > div:nth-child(1) > div > div > div > div > table > tbody > tr > th > table:nth-child(4) > tbody > tr > td';
$dat = 'body > div:nth-child(3) > div:nth-child(2) > div > table:nth-child(10) > tbody > tr > td > div > div:nth-child(1) > div > div > div > div > table > tbody > tr > th > table:nth-child(1) > tbody > tr > td:nth-child(1)';

//arrays
$introArr = array();
$urlArr = array();

$crawler = $client->request('GET', 'https://www.morningbrew.com/daily/2019/11/07');
$intro = $crawler->filter($intr)->each(function($node) {
    return $node;
});
$date = $crawler->filter($dat)->each(function($node) {
    return $node->html();
});
array_push( $introArr, $intro, $date);

Я хотел бы получить обратно:

enter image description here

Любые предложения, что я делаю неправильно?

Я ценю ваши ответы!

1 Ответ

1 голос
/ 08 ноября 2019

Селекторы, которые вы предоставляете методу 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() вызовы объединены здесь для большей читаемости, но это вопрос предпочтений. Также допустимо объединение всех селекторов в один.

...