我想选择以下html项目(动作,喜剧),但最后一项(标签)除外。
要选择我的所有关注代码,请执行以下操作:
//*[@id="video-tags"]//a[contains(@href,'tags')]
但要选择除最后一个(标签)之外的选项,它将无法使用我的关注代码:
//*[@id="video-tags"]//a[contains(@href,'tags') not(position() > last() -1)]
html
<ul id="video-tags">
<li>Uploader: </li>
<li class="profile_name"><a href="/profiles/wilco">wilco</a></li>
<li><em>Tagged: </em></li>
<li><a href="/tags/action">action</a>, </li>
<li><a href="/tags/comedy">comedy</a>, </li>
<li>more <a href="/tags/"><strong>tags</strong></a></li>
</ul>
提前致谢
尼克
答案 0 :(得分:15)
除了语法错误之外 - 您需要一个and
,即contains(@href,'tags') and not(position()...)
- 您正在嘲笑//
的定义方式。
XPath //a[position() < last()]
将不为您提供除最后一个a
以外的每个a
,它将为您提供不是最后一个a
li
在其各自的父元素内。由于每个a
最多包含一个a
,每个 a
都是其各自父级中的最后一个position
,因此此测试不会在所有
您可以通过将大部分表达式包装在括号中并将(//*[@id="video-tags"]//a[contains(@href,'tags')])[position() < last()]
检查放在单独的谓词中来实现您想要的效果
a
括号使最终谓词应用于表达式选择的节点集作为一个整体,而不仅仅是a
位置步骤,即它将首先找到所有href
个元素//
包含“tags”,然后按文档顺序返回除最后一个选定元素之外的所有元素。
技术说明 - XPath中/descendant-or-self::node()/
的定义是它是//a
(包括斜杠)的简写,这是一个位置步骤,为您提供此节点及其所有后代节点。因此/descendant-or-self::node()/child::a
表示//a[something]
,/descendant-or-self::node()/child::a[something]
表示child::
- 谓词适用于descendant-or-self::
步骤,而不是descendant::
步骤。如果要将谓词应用于后代搜索,则应明确使用/descendant::a[something]
轴 - {{1}}。
答案 1 :(得分:0)
试试这个
(//ul[@id="video-tags"]//a[contains(@href,'tags')]/text())