Xpath 选择项目(最后一项除外)包含语法
Posted
技术标签:
【中文标题】Xpath 选择项目(最后一项除外)包含语法【英文标题】:Xpath select items except last item wth contain syntax 【发布时间】:2013-09-13 23:27:05 【问题描述】:我想选择以下 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>
提前致谢
尼克
【问题讨论】:
【参考方案1】:除了语法错误 - 您还需要一个 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
定位步骤,即它将首先找到href
包含的所有a
元素"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.. :) 这是一个非常好的解释!非常感谢,对我帮助很大:)【参考方案2】:试试这个
(//ul[@id="video-tags"]//a[contains(@href,'tags')]/text())
【讨论】:
这将选择a
元素的文本节点子节点,而不是 a
元素本身。以上是关于Xpath 选择项目(最后一项除外)包含语法的主要内容,如果未能解决你的问题,请参考以下文章