2010-08-23 78 views
0

我試圖從頁面中提取所有相關的URL和圖像,並將它們放入一個數組中,下面的代碼工作正常,除了它輸出第一對數字的正確數字倍。我想也許我在指定XPATH時犯了錯誤,但我已經在3個不同的站點上測試過,每次都有相同的結果。PHP DOMXPATH&Array

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
$xpath = new DOMXPath($dom); 

$items = $xpath->query("//div[@class=\"row\"]"); 

foreach ($items as $item) { 

$value['url'] = $xpath->query("//div[@class=\"productImg\"]/a/@href",$item)->item(0)->nodeValue; 

$value['img'] = $xpath->query("//div[@class=\"productImg\"]/a/img/@src",$item)->item(0)->nodeValue; 

$result[] = $value; 


} 

print_r($result); 

很明顯,代碼是不正確的,但我還沒有能夠縮小到違規部分。在有人建議使用正則表達式之前,我通常會這樣做,但如果可能的話,我寧願使用XPATH。

回答

1

鑑於query("//div[@class=\"productImg\"]/a/img/@src",$item)它看起來像你想執行相對$item查詢。你幾乎沒有,只是不完全。

您的查詢與//div開始,這意味着,以尋找任何<div>節點它們是文檔根的後代和滿足所述查詢的所述剩餘部分。您墮落的關鍵在於,如文中所述,該表達式來自文檔根目錄。

爲了選擇上下文節點,你應該.這樣.//div將匹配任何<div>節點它們是從上下文節點後代開始表達(即你的$item)。

+0

你是對的,謝謝! – 2010-08-24 19:14:25

0

對於HTML的外觀有太多的假設,但是我可以發現的一個問題是 - > item(0)部分。這需要反映所討論的迭代。

假設$項目總會有數字鍵:

foreach($items as $key => $item) { 
..... item)->item($key)->nodeValue; 
}