使用dom抓取来自file_get_content的源代码


Using dom to scrape the source code coming from file_get_content

我正试图从以下页面获取评论、费率和日期:

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

通过从页面中提取一些代码,我可以在这里得到结果:

https://eval.in/143036

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

警告:DOMDocument::loadHTML():htmlParseEntityRef:应为";"在实体中,F:''wamp''www''htdocs''thenwat''yelp.php.中的第700行

我使用了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');

DOMDocument非常适合格式良好的文档,但并非所有HTML页面都是格式良好的。使用简单HTML DOMhttp://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浏览器

Firebug Web开发工具

在W3Schools 学习CSS