我想选择以下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>
提前致谢
缺口
解决方法
除了语法错误 – 你需要一个和,即包含(@ href,’tags’)而不是(position()…) – 你正在嘲笑如何定义//的微妙之处.
XPath // a [position()< last()]除了最后一个之外不会给你每一个,它会给你每一个不是它的各个父元素中的最后一个.由于每个li最多包含一个a,因此每个a都是其各自父级中的最后一个,因此该测试将完全不匹配. 您可以通过将大部分表达式括在括号中并将位置检查放在单独的谓词中来实现您想要的效果
(//*[@id="video-tags"]//a[contains(@href,'tags')])[position() < last()]
括号使得最终谓词应用于由表达式作为整体选择的节点集,而不仅仅是位置步骤,即它将首先找到其href包含“tags”的所有元素,然后返回除了文档顺序中的最后一个选定元素.
技术解释 – 在XPath中//的定义是它是/ descendant-or-self :: node()/(包括斜杠)的简写,这是一个位置步骤,为您提供此节点及其所有后代节点.所以//表示/ descendant-or-self :: node()/ child :: a和// a [something]表示/ descendant-or-self :: node()/ child :: a [something] – 谓词适用于child :: step,而不是descendant-or-self :: one.如果要将谓词应用于后代搜索,则应该使用descendant :: axis explicit – / descendant :: a [something].