使用 Goutte 连续抓取图像、链接和文本

Scrape Images, Links and Texts serially using Goutte

我有下面的代码试图将 html 元素 1 个 1 个连续地包含它自己的标签,而没有任何 stylesclasses。另外,我没有得到 images

    $client = new Client();

    $crawler = $client->request('GET', 'http://www.tutorialspoint.com/laravel/laravel_ajax.htm');

    $crawler->filter('h1, h2, h3, h4, h5, h6, p, pre, p > img, div > img, p > a')->each(function(Crawler $node, $i){
        if ($node->filter('p')){
            echo $node->text()."<br/>";

        } else if ($node->filter('pre')) {
            echo '<code>'.$node->html().'</code><br/>';
        }
    });

但是无论我做什么,当我使用 $node->text() 时我只会收到文本,或者当我在该页面中使用 $node->html() 时我会收到该页面中的所有 html。

我试图获得例如 p - <p>Text Here</p>img - <img src="default.jp"/>.

$node->filter('p') 将始终 return 为真,因为函数 filter 的 returned 值是一个 Crawler 对象,所以第二个else if 从未打过电话。
如果你想检查爬虫中是否有节点,你可以使用 count() 函数。

至于你的代码——我不太确定为什么这是你正在做的,但基本上你的代码所做的是检查当前元素是否有一个<p> 子元素(这是你想要做的吗?),如果有 - 打印父节点文本的内容。

为了从 Crawler ($node) 获取节点 DOMElement,您可以使用

$node->getNode(0)`

并且使用这个节点你可以检查nodeName(==标签名称),获取textContent(标签的内容)等

这是您可以使用的示例:

$crawler = $client->request('GET', 'http://www.tutorialspoint.com/laravel/laravel_ajax.htm');

$crawler->filter('h1, h2, h3, h4, h5, h6, p, pre, p > img, div > img, p > a')->each(function(Crawler  $node, $i){
    if (in_array($node->getNode(0)->nodeName, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'a'])) {
        echo "{$node->getNode(0)->nodeName} => {$node->getNode(0)->textContent}.<br/>\n";
    } elseif ($node->getNode(0)->nodeName == 'pre') {
        echo "pre => <code>".$node->html()."</code><br/>\n";
    } elseif ($node->getNode(0)->nodeName == 'img') {
        echo 'img => src="'.$node->getNode(0)->getAttribute('src')."\" <br/>\n";
    }
});