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


Use FILTER() inside Foreach loop - PHP Goutte

我有这个代码

require_once'vendor/autoload.php';

使用Symfony''Component''DomCrawler''Ccrawler;

$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选择元素?

我找了很多,但什么也没找到。

只需使用文档中的示例

$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');
}

错误在这一行:

$domElement->filter('span');

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

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

例如,您可以直接针对span标签:

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

或者在第一个过滤器的返回值上应用第二个过滤器(也是爬网程序实例):

$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');
}