xPath:为什么以下不起作用?

时间:2010-09-02 08:36:02

标签: php 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>';
}

2 个答案:

答案 0 :(得分:3)

不应该是 //table[@id="SubCategory_SubCategoryDataList"]//a/@href

(注意a之前的两个斜杠,因为你没有看直接的孩子)

答案 1 :(得分:3)

如果您的代码包含错误抑制运算符(@),首先要删除它以查看它是否实际上是否存在错误。在你的情况下,它做到了。很多。实际上,DOM无法加载内容(至少当我尝试使用saveXML()输出文件时,它不会显示任何内容)。使用DOM加载损坏的HTML的正确方法是使用:

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,你会看到a元素都会有来自表id的id,所以你可以直接用

查询它们。
 '//a[contains(@id, "SubCategory_SubCategoryDataList")]/@href'