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() &lt; 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 选择项目(最后一项除外)包含语法的主要内容,如果未能解决你的问题,请参考以下文章

xpath语法

Scrapy XPath语法

XPath语法

xpath语法

XPath 常用语法札记

xpath语法