2013-11-03 71 views
1

我想抓住的名字和从advisor.travel网站上哪些内容的地方坐标为CC,所以我只需要前10个页面的名称和坐标...使用XPath抓取文本内容

链接到景点链接格式:http://en.advisor.travel/poi/1所以'http://en.advisor.travel/poi/'.i其中i是吸引数

我想只有前10的吸引力,所以我是beetween 1个10和XPath的名字是

//h1 tag 

和XPath的坐标是:

//span[@class='latitude'] 
//span[@class='longitude'] 

我现在创建一个刮刀和代码是:

<?php 


for ($i=0; $i<=10; $i++) 
    { 
    $dom2 = new DOMDocument(); 
    @$dom2->loadHTMLFile('http://en.advisor.travel' . $i); 
    $xpath2 = new DOMXPath($dom2); 
    $data = array(); 
    $data[name] = $xpath2->query("//h1"); 
    $data[latitude] = $xpath2->query("//span[@class='latitude']"); 
    $data[longitude] = $xpath2->query("//span[@class='longitude']"); 

    } 
echo '<pre>' . print_r($data, true) . '</pre>'; 



?> 

但这种代码的结果让我只有这个:

Array 
(
    [name] => DOMNodeList Object 
     (
      [length] => 0 
     ) 

    [latitude] => DOMNodeList Object 
     (
      [length] => 0 
     ) 

    [longitude] => DOMNodeList Object 
     (
      [length] => 0 
     ) 

)  

那么,如何解决这个问题?这里有什么问题?

+0

再次是一样的... –

回答

2

你用(@)运算符来抑制错误,所以你没有注意到URL实际上是不正确的。

调用应该是:

@$dom2->loadHTMLFile('http://en.advisor.travel/poi/' . $i); 

而且下面,您具备以下条件:

$data[name] = $xpath2->query("//h1"); 

有两件事情错了这条线(和下方的两行):

  • 你正在使用一个常量作为关键。你应该用单引号包装它。
  • 即使上述错误得到解决,您也只能得到for循环的最后一次迭代的值。要正确地将元素推入$data阵列,您必须使用$data['key'][]语法。

不是简单地查询XPath,而是访问该XPath节点的textContent。对于这一点,你可以使用textContent()

$data['name'][] = $xpath2->query("//h1")->item(0)->textContent; 
$data['latitude'][] = $xpath2->query("//span[@class='latitude']") 
                ->item(0)->textContent; 
$data['longitude'][] = $xpath2->query("//span[@class='longitude']") 
                ->item(0)->textContent; 

完整的代码应该是这样的:

<?php 

for ($i=0; $i<=12; $i++) 
{ 
    $dom2 = new DOMDocument(); 
    @$dom2->loadHTMLFile('http://en.advisor.travel/poi/' . $i); 
    $xpath2 = new DOMXPath($dom2); 
    $data = array(); 
    $data['title'][] = $xpath2->query("//h1")->item(0)->textContent; 
    $data['latitude'][] = $xpath2->query("//span[@class='latitude']")->item(0)->textContent; 
    $data['longitude'][] = $xpath2->query("//span[@class='longitude']")->item(0)->textContent; 
    echo "<hr/>"; 
} 

echo '<pre>' . print_r($data, true) . '</pre>'; 

?> 

从技术上讲,这应该工作,但是因为有要查询12周不同的网址,我不我认为这是一个好主意,因此不建议这样做。

+0

有什么更好的方法来做到这一点? –

+0

从此网站获取此数据的好方法是什么? –

+0

@drCode:没有*更好的办法。屏幕抓取被认为是一个非常糟糕的主意。无论如何,如果你已经有了位置,你可以使用[Google Maps API](http://stackoverflow.com/q/8633574/1438393)获取经纬度:) –