无法通过xpath访问具有多个名称空间的xhtml文档中的节点
好的,我试图用curl和xpath解析一个xhtml网站。
该网站有多个名称空间:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:addthis="http://www.addthis.com/help/api-spec" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
我试图从网站的分页中获取所有网址,如下所示:
$url = [site_im_parsing];
$dom = new DOMDocument();
@$dom->loadHTML($url);
$xpath = new Domxpath($dom);
$xpath->registerNamespace("x", "http://www.w3.org/1999/xhtml");
$pages = $xpath->query('//x:div[2]/x:table/x:tbody/x:tr/x:td[1]/x:a');
for ($i = 0; $i < $pages->length; $i++) {
echo $pages->item($i)->getAttribute('href');
}
这不起作用。 (没有x名称空间的xpath到分页应该是正确的)。 我应该注册所有的命名空间并在xpath查询中以某种方式使用它们吗?
最好的问候,AB
//问题更新//
这是我试图解析的页面的一部分:(我想要的href的)
<div class="pager">
<table style="width:100%" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<span class="current">1</span> |
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=1">2</a> |
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=2">3</a> |
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=3">4</a> |
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=4">5</a> |
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=5">6</a> |
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=6">7</a>
</td>
<td style="text-align:right">
<a href="http://www.somewebsite.com/catalog?on_offer=1&commodity_offset=1">Next</a>
</td>
</tr>
</tbody>
</table>
</div>
文档类型是:
html PUBLIC“ - // W3C // DTD XHTML 1.0 Transitional // EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”
如果这有什么区别...
对于loadHTML
我希望任何命名空间都被忽略,所以尽量不要使用registerNamespace
,然后使用$xpath->query('//div[2]/table/tbody/tr/td[1]/a');
。 作为XML的替代解析,然后使用名称空间是有道理的。
好吧,我明白了......
当文档不存在时,浏览器会插入一个隐含标签<tbody>。 xpath只会处理原始HTML字符串中的标签,所以我只是忽略了<tbody>标签。
旧的xpath查询:
$xpath->query('//div[2]/table/tbody/tr/td[1]/a');
新:
$xpath->query('//div[2]/table/tr/td[1]/a');
链接地址: http://www.djcxy.com/p/69689.html
上一篇: Can't access nodes in xhtml document with multiple namespaces through xpath