2010-09-02 94 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