【问题标题】:Xpath select items except last item wth contain syntaxXpath 选择项目(最后一项除外)包含语法
【发布时间】: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>

提前致谢

尼克

【问题讨论】:

    标签: html dom xpath


    【解决方案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 元素本身。
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多