我遇到了XPath问题。我有一个结构复杂的HTML页面,我想在特定的div中选择所有href的元素,无论嵌套的深度如何。 为什么下一个代码不起作用,我该怎么做才能修复?
//*[@id='some_id']//*//a
答案 0 :(得分:1)
@href
属性选择所有@href
属性,而不是所有锚标记。
//*[@id='some_id']//@href
如果您只想匹配锚标记的@href
属性,请转到此查询,选择“some_id”元素中的所有锚标记,然后选择其@href
标记。
//*[@id='some_id']//a/@href
//
和descendant-or-self
- 轴我不确定你想用.//*//a
构造实现什么。这是
./descendant-or-self::node()/child::*/descendant-or-self::node()/child::a
所以中间必须有一些元素。如果锚标记直接包含在@id='some_id'
- 元素中,则不会找到它,例如对于此输入:
<div id='some_id'><a href="foo">bar</a></div>
//*[@id='some_id']//a
会匹配此元素。
答案 1 :(得分:0)
//
解决整个后代轴,所以这就足够了:
//*[@id='some_id']//a
否则,您不会得到a
元素,这些元素是使用//*[@id='some_id']
寻址的元素的直接后代。 (如果您的环境将id
属性识别为ID,您也可以使用id('some_id')
来解决此元素。)
但你的问题可能会有所不同。 //a
通常会解决null命名空间中的所有a
个元素。可能您的a
元素不在null命名空间中,而是在XHTML命名空间中。你可以像
//*[@id='some_id']//*[local-name()='a' and namespace-uri()='http://www.w3.org/1999/xhtml']
或者,如果您只需要预期HTML元素
//*[@id='some_id']//*[local-name()='a']
或在XPath 2.0中甚至更简单
//*[@id='some_id']//*:a
根据您的环境,您还可以注册名称空间前缀,以便您可以执行类似
的操作//*[@id='some_id']//html:a
在XPath 1.0和2.0中。