【问题标题】:Use FILTER() inside Foreach loop - PHP Goutte在 Foreach 循环中使用 FILTER() - PHP Goutte
【发布时间】:2016-07-19 19:09:55
【问题描述】:

我有这个代码

require_once 'vendor/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 选择元素?

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

【问题讨论】:

    标签: php symfony goutte


    【解决方案1】:

    只需使用您在docs 中的示例

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

    或做 -&gt;each(\Closure $closure) 函数在后台所做的工作:在循环内实例化爬虫节点

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

    【讨论】:

      【解决方案2】:

      错误在这一行:

      $domElement->filter('span');
      

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

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

      例如,您可以直接定位 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');
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 2012-08-25
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        • 2016-09-26
        相关资源
        最近更新 更多