所以我试图使用DOMDocument在PHP中制作/重制Web Scraper。我必须完成的项目需要使用本机PHP,因此不使用cURL。我查看了使用reg表达式,但DOMDocument似乎更好。
无论如何我无法将其输出,我不知道为什么。我不是在说些什么吗?
<?php
class WebScraper{
private $url = 'http://todaysinfo.net/top-15-most-dangerous-airports/?utm_source=outbrain_airports&utm_campaign=outbrain_airports';
private $elements = array('title', 'p', 'img');
private $scraper_doc = null;
public function __construct($url){
if($url){
$this->url = $url;
$this->scrapeData();
if($this->scraper_doc){
$this->parseData();
$this->outPut();
} else {
echo '<p style="color: red;">Something happened with DOMDocument."';
}
}
}
function scrapeData(){
$urlContents = @file_get_contents($this->$url);
if($urlContents){
$this->scraper_doc = new DOMDocument();
libxml_use_internal_errors(TRUE);
$this->scraper_doc->loadHTML($urlContents);
} else {
echo '<p style="color: red;">Didn\'t grab all of the contents."';
}
}
function parseData(){
foreach($this->$elements as $element){
$scraper_row = $this->scraper_doc->getElementsByTagName($element);
foreach($scraper_row as $row){
if($element == 'img'){
echo $row->getAttribute('src') . "<br />";
} else {
echo $row->nodeValue . "<br />";
}
}
}
}
}
?>
答案 0 :(得分:0)
此:
$urlContents = @file_get_contents($this->$url);
^
您没有访问在对象定义中指定的$url
。您正在访问$this->null
,因为在$url
方法的范围内scrapeData()
未定义。
php > $x = new StdClass();
php > $x->foo = 'foo';
php > var_dump($x->foo);
string(3) "foo"
php > var_dump($x->$foo);
PHP Notice: Undefined variable: foo in php shell code on line 1
PHP Fatal error: Cannot access empty property in php shell code on line 1
答案 1 :(得分:0)
我认为如果你改变这一行会有所帮助:
$urlContents = @file_get_contents($this->$url);
到这一行:
$urlContents = @file_get_contents($this->url);
并更改此行:
foreach($this->$elements as $element){
到这一行:
foreach($this->elements as $element){
然后,如果我像这样运行你的代码,我得到一个结果:
$webScraper = new WebScraper(null);
$webScraper->scrapeData();
$webScraper->parseData();
您还可以检查file_get_contents
是否有效。如果没有,也许this page可能会对您有所帮助。