8

我想选择以下 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>

提前致谢

缺口

4

2 回答 2

18

除了语法错误 - 你需要一个and, ie contains(@href,'tags') and not(position()...)- 你在如何//定义的微妙之处绊倒了。

XPath//a[position() < last()]不会给你除了最后一个之外的每一个,它会给你每一个不是它各自父元素中最后一个的。由于 each最多包含 one ,every是其各自父级中的最后一个,因此该测试将不匹配任何内容。aaalia aa

position您可以通过将大部分表达式包装在括号中并将检查放在单独的谓词中来实现您想要的

(//*[@id="video-tags"]//a[contains(@href,'tags')])[position() < last()]

括号导致最终谓词应用于整个表达式选择的节点集,而不仅仅是a定位步骤,即它将首先找到包含“标签”a的所有元素href,然后返回除最后一个之外的所有元素按文档顺序选择元素。


技术解释 -//在 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]

于 2013-09-10T10:24:03.297 回答
0

尝试这个

(//ul[@id="video-tags"]//a[contains(@href,'tags')]/text())
于 2013-09-10T10:26:39.670 回答