使用dom废弃来自file_get_content的源代码

时间:2014-04-28 07:04:38

标签: php dom web-scraping

我正在尝试从此页面获取评论,评分和日期:

  

http://www.yelp.com/biz/franchino-san-francisco?start=80

通过从页面获取一些代码我可以得到结果:

https://eval.in/143036

但是当我使用file_get_contents将其应用于整个页面源时,它会给出一组警告,如:

  

警告:DOMDocument :: loadHTML():htmlParseEntityRef:expecting';'在实体中,行:700:F:\ wamp \ www \ htdocs \ thenwat \ yelp.php。

我使用escapeshellargnl2br删除了此问题,但没有任何帮助。

请参阅:https://eval.in/143074

以下代码适用于较小的源代码段:https://eval.in/143036

$classname = 'rating-qualifier';
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$results = $xpath->query("//*[@class='" . $classname . "']");

if ($results->length > 0) {
    echo $review = $results->item(0)->nodeValue;
}   
$classname = 'review_comment ieSucks';
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$results = $xpath->query("//*[@class='" . $classname . "']");    
if ($results->length > 0) {
    echo $review = $results->item(0)->nodeValue;
}    
$meta = $dom->documentElement->getElementsByTagName("meta");
echo $meta->item(0)->getAttribute('content');

1 个答案:

答案 0 :(得分:1)

DOMDocument非常适合格式良好的文档,但并非所有HTML页面都是格式良好的。请改用简单HTML DOM http://sourceforge.net/projects/simplehtmldom/。我创建了一个工作解决方案,可以提取您请求的数据。

yelp.php

<?php

  ini_set('display_errors', 1);
  error_reporting(E_ALL ^ E_NOTICE);

   /************************************************
   *                                               *
   *    2014.04.28                                 *
   *    Developed by Ben McFarlin at Qeala Labs    *
   *    www.qeala.com                              *
   *                                               *
   ************************************************/

    include_once('simple_html_dom.php');

  function yelp($url){
    print("$url\n");

    $root = new stdClass();
    $items = array();
    $html = file_get_html($url);

    if($html){

      $containers = $html->find('div.review-list div.review div.review-wrapper');
      foreach($containers as $container){
        $comments = $container->find('div.review-content p.review_comment');
        $item = new stdClass();
        foreach($comments as $comment){
          $comment_html = $comment->innertext();
          $item->comment = $comment_html;
        }
        $metas = $container->find('div.review-content meta');
        foreach($metas as $meta){
          $itemprop = $meta->itemprop;
          $content = $meta->content;
          if($itemprop == 'ratingValue') $key = 'rating';
          else $key = 'date';
          $item->$key = $content;
        }
        $items[] = $item;
      }
    }

    $root->items = $items;

    if($html){
      $html->clear();
      unset($html);
    }

    return $root;
  }

  $url = 'http://www.yelp.com/biz/franchino-san-francisco?start=80';
  $root = yelp($url);
  var_dump($root);


?>

更新

我安装了带Firebug扩展的FireFox。在查看网页时,我右键单击要捕获的数据,然后选择 使用FireBug检查元素。 将打开调试窗口,其中已选择HTML元素。我右键单击该元素并选择 复制CSS路径。 这将为元素提供完整的CSS选择器。通常情况下它过于具体,可以简化为几个元素。然后我查看HTML结构(已在调试窗口中打开)以确定我可以消除的内容。在那一点上,它只是了解CSS选择器的问题。希望有所帮助。这可能需要一些练习,但你会发现这种技术对于任何类型的HTML / CSS工作都是非常宝贵的。

Firefox Web Browser

Firebug Web Development Tool

Learn CSS at W3Schools