【问题标题】:Symfony DomCrawler empty objectSymfony DomCrawler 空对象
【发布时间】:2014-11-08 19:42:29
【问题描述】:

我正在尝试使用 Laravel 4 和 Symfony DomCrawler 来获取评论网站的评分。 我们以这个网站为例:http://estorereview.com.au/s/5951/A-Supplements 我想获得 4.8 的 5 颗星

这是我尝试的部分代码:

<?php

use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\CssSelector\CssSelector;

function getRatingEstoreReview($url){
  $html = getHtmlCurl($url);
  $crawler = new Crawler($html);
  $crawler = $crawler->filter('span[itemprop="ratingValue"]'); 
  var_dump($crawler);
  die("test");
  return normalize($crawler,5);
}

var_dump 返回以下内容:

object(Symfony\Component\DomCrawler\Crawler)[280]
  protected 'uri' => null
  private 'defaultNamespacePrefix' => string 'default' (length=7)
  private 'namespaces' => 
    array (size=0)
      empty

我在其他网站等上试过这个,但我总是得到一个空对象。使用$crawler-&gt;first 访问该值也不起作用。

我做错了什么?谢谢。

编辑:即使我正在过滤“div”,Crawler 仍然是空的。 PHP Simple HTML DOM Parser 工作正常

【问题讨论】:

    标签: php symfony laravel-4 web-scraping


    【解决方案1】:

    该元素的完整 CSS 路径是 body &gt; div:nth-child(3) &gt; div &gt; div &gt; div.left-container.floatl &gt; div.top &gt; div.top-inner &gt; div.store-rating-container.floatl &gt; div.star-col.floatl.overall-rating-stars &gt; div.rating-text.floatl &gt; div &gt; strong &gt; span。您是否尝试过使用它作为过滤词?

    您也可以改用filterXPath(),在这种情况下,您正在寻找/html/body/div[3]/div/div/div[4]/div[1]/div[2]/div[2]/div[1]/div[2]/div/strong/span

    编辑:它看起来并不适用于这个特定页面,但只是想提一下网络抓取的“陷阱”。请记住,对于某些网页,内容将由 JavaScript 操作(后加载)。在这种情况下,DomCrawler 可能根本看不到您要查找的元素。

    更新:

    这是我看到的结果。我使用的是Goutte 而不是getHtmlCurl()

    代码:

    use Goutte\Client;
    use Symfony\Component\DomCrawler\Crawler;
    
    $client = new Client();
    $crawler = $client->request('GET', 'http://estorereview.com.au/s/5951/A-Supplements');
    var_dump($crawler->filter('span[itemprop="ratingValue"]')); 
    echo $crawler->filter('span[itemprop="ratingValue"]')->text();
    die("<br />test completed");
    

    输出:

    object(Symfony\Component\DomCrawler\Crawler)[177]
      protected 'uri' => string 'http://estorereview.com.au/s/5951/A-Supplements' (length=47)
      private 'defaultNamespacePrefix' => string 'default' (length=7)
      private 'namespaces' => 
        array (size=0)
          empty
    4.8
    test completed
    

    所以,这行得通。

    【讨论】:

    • “PHP 简单 HTML DOM 解析器”为我完成了这项工作。这就是为什么我想知道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多