我正试图从以下页面获取评论、费率和日期:
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行
我使用了escapeshellarg
和nl2br
来消除这个问题,但没有任何帮助。
请参阅: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