使用goutte从链接返回空值

我正在运行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);

我想回来:

使用goutte从链接返回空值

有人建议我在做什么错吗?

感谢您的答复!

zhouzombie 回答:使用goutte从链接返回空值

您为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()调用在此处链接起来以提高可读性,但这是优先选择的问题。将所有选择器串联在一起也是有效的。

本文链接:https://www.f2er.com/3141719.html

大家都在问