XPath选择元素中的所有href

时间:2014-03-02 14:40:02

标签: html xpath

我遇到了XPath问题。我有一个结构复杂的HTML页面,我想在特定的div中选择所有href的元素,无论嵌套的深度如何。 为什么下一个代码不起作用,我该怎么做才能修复?

//*[@id='some_id']//*//a

2 个答案:

答案 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中。