为什么以下不起作用?:
$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>';
}
答案 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'