使用goutte从链接返回Emtpy

问题描述 投票:1回答:1

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

任何建议我做错了什么?

感谢您的答复!

php css-selectors goutte
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.