我想选择以下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>
提前致谢
缺口
Ian*_*rts 16
除了语法错误之外 - 你需要一个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位置步骤,即它将首先找到包含"tags"的所有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].
| 归档时间: | 
 | 
| 查看次数: | 6984 次 | 
| 最近记录: |