2010-09-02 96 views
2

爲什麼下面不工作?:xPath:爲什麼以下不起作用?

$dom = new DOMDocument(); 
@$dom->load('http://tinyurl.com/35cs96n'); 
$xpath = new DOMXPath($dom); 

$entries = $xpath->query('//table[@id="SubCategory_SubCategoryDataList"]/a/@href'); 

foreach ($entries as $entry) { 
    echo $entry->nodeValue.'<br>'; 
} 
+1

查詢他們中有'fopen()函數'使包裝?另外,我建議前面的網址縮短鏈接,因爲它是一個不必要的呃打開頁面,可能會或可能不會總是可用。 – alex 2010-09-02 08:39:12

+1

你能解釋一下「不工作」是什麼意思嗎?應該發生的事情不是? – Oded 2010-09-02 08:40:21

回答

3

是不是它應該是 //table[@id="SubCategory_SubCategoryDataList"]//a/@href

(注意a前的兩條斜線,因爲你不看直接孩子)

3

如果您的代碼包含錯誤抑制運算符(@),首先要做的是將其刪除以查看它是否確實抑制了錯誤。在你的情況下,它的確如此。很多。實際上有很多DOM不能加載內容(至少當我試圖用saveXML()超過文件時它不會顯示任何內容)。加載HTML破碎與DOM的正確方法是使用:

libxml_use_internal_errors(TRUE); 
$dom = new DOMDocument(); 
$dom->loadHTMLFile('http://tinyurl.com/35cs96n'); 
libxml_clear_errors(); 

加載頁面loadHTMLFile將DOM使用HTMLParser的模塊,它是更寬容有關斷標記。而libxml函數調用將使錯誤遠離你。

至於XPath,請嘗試@slhck's suggestion。 a元素不是桌子的直接子元素。中間有tr和td元素。如果你看一下HTML,你會看到一個元素都將有從表ID本身衍生的ID,所以你可以直接與

'//a[contains(@id, "SubCategory_SubCategoryDataList")]/@href' 
+0

好的補充,謝謝! – slhck 2010-09-02 09:06:46