2013-11-03 62 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)獲取經緯度:) –