我正在运行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);
我想回来:
任何建议我做错了什么?
感谢您的答复!
您为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()
调用在此处链接起来以提高可读性,但这是优先选择的问题。将所有选择器串联在一起也是有效的。