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

时间:2016-08-08 17:12:37

标签: php laravel-5.2 goutte

我有以下代码尝试将unsigned int元素1依次串行包含自己的标记而不包含任何htmlstyles。另外,我没有得到classes

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()或该页面中的所有html时,我只会获得文字。

我试图以$node->html() - p为例。 <p>Text Here</p> - img

1 个答案:

答案 0 :(得分:2)

$node->filter('p')将始终返回true,因为函数filter的返回值是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";
    }
});