在Foreach循环中使用FILTER() - PHP Goutte

时间:2016-07-19 19:09:56

标签: php symfony goutte

我有这段代码

require_once'proforts / autoload.php';

使用Symfony \ Component \ DomCrawler \ Crawler;

$html = <<<'HTML'
<!DOCTYPE html>
<html>
    <body>
        <p class="message">Hello World!
        <span>This is span</span>
        </p>
        <p>Hello Crawler!
                <span>This is span</span>
    </p>
    </body>
</html>
HTML;

$crawler = new Crawler($html);

foreach ($crawler->filter('body') as $domElement) {
   $domElement->filter('span');
}

我收到此错误。

Fatal error: Call to undefined method DOMElement::filter() 

我需要知道如何在Foreach循环中使用CSS Selectors选择元素?

我搜索了很多但没有找到任何东西。

2 个答案:

答案 0 :(得分:4)

只使用您在docs

中的示例
$crawler = new Crawler($html);

$crawler->filter('body')->each(function(Crawler $node, $i){
    return $node->filter('span');
});

或执行->each(\Closure $closure)函数的工作:实例化循环内的爬虫节点

foreach ($crawler->filter('body') as $domElement) {
    $domElement = new Crawler($domElement);
    $domElement->filter('span');
}

答案 1 :(得分:3)

错误在这一行:

$domElement->filter('span');

原因是 $ domElement 不属于 Crawler 类,因此不知道过滤器方法。

有很多方法可以解决这个问题。

例如,您可以直接定位span代码:

foreach ($crawler->filter('span') as $spanElement) {
   // do something basic with $spanElement
}

或对第一个过滤器的返回值应用第二个过滤器(同样是 Crawler 实例):

$crawlerBodies = $crawler->filter('body');
$crawlerSpans = $crawlerBodies->filter('span');

或使用filterXPath

$crawlerSpans = $crawler->filterXPath('//span');

或将 DOMElement 对象转换回 Crawler 对象:

foreach ($crawler->filter('body') as $domElement) {
    $domElement = new Crawler($domElement);
    $domElement->filter('span');
}