【问题标题】:XPath: select node that contains normalized text, excluding ancestor nodesXPath:选择包含规范化文本的节点,不包括祖先节点
【发布时间】:2019-12-22 20:49:56
【问题描述】:

我正在寻找一个高性能的通用查询来选择“快速棕色狐狸跳过懒狗”。类似于简单的 CMD+C 复制文本的方式。

似乎我需要使用textContent,但我的 XPath 也在选择祖先(直到正文),而不仅仅是第一个(少数)祖先。如何限制范围?


示例node.textContent

"

    The
    quick brown fox
    jumped over the


    lazy dog.

"

运行代码片段→整页→按照说明进行操作

<div id='dont-select-this' style='text-align:center'>
  <div id='dont-select-this-but-it-would-be-cool-if-you-could' style='background:lightgreen;'>
    <div id='select-this-one'>
      <p>
        <span>The</span>
        <em>quick brown fox</em>
        <span>jumped over the</span>
      </p>
      <p>
        lazy<span> </span><b>dog.</b>
      </p>
    </div>
  </div>
  <hr>
  <div>open chrome devtools → console</div>
  <div>change frame (see below)</div>
  <div>type <code>$x('//*[contains(., "quick brown fox")]')</code></div>
  <hr>
  <img alt='select chrome devtools frame' height=300 src='https://i.imgur.com/L1MhCY8.png'/>
</div>

【问题讨论】:

    标签: javascript html xml xpath


    【解决方案1】:

    这个 XPath,

    //div[normalize-space() = 'The quick brown fox jumped over the lazy dog.']
    

    仅选择具有以下@id 值的两个div 元素,

    dont-select-this-but-it-would-be-cool-if-you-could
    select-this-one
    

    根据要求。


    如果您确实想排除 id 值为 dont-select-this-but-it-would-be-cool-if-you-could(尽管有其名称)的 div 元素,并且选择具有注明字符串值的最深元素,然后:

    1. 向上述 XPath 添加一个附加谓词。
    2. div 更改为*

    总共:

    //*[         normalize-space() = 'The quick brown fox jumped over the lazy dog.' ]
       [not(.//*[normalize-space() = 'The quick brown fox jumped over the lazy dog.' ])]
    

    这仅选择id 属性值为select-this-onediv

    【讨论】:

    • 我实际上正在寻找一种方法,它不依赖于仅有的两个选择 &lt;div&gt;s,而是它们是直系祖先,对此感到抱歉..
    • 那么在 XPath 中用* 代替div
    • 不正确。 //*[normalize-space() = 'The quick brown fox jumped over the lazy dog.'] 不会选择 bodyhtml,因为它们的 字符串值 包含来自其他文本节点的字符串。
    • $x("//*[contains(normalize-space(.), 'The quick brown fox jumped over the lazy dog.')]")
    • 只有当您的 HTML 不包含您发布的代码所包含的其他元素时才会发生这种情况:&lt;div&gt;open chrome devtools → console&lt;/div&gt; 等。
    【解决方案2】:

    结束了这个

    //*[         contains(normalize-space(.), 'The quick brown fox jumped over the lazy dog.') ]
       [not(.//*[contains(normalize-space(.), 'The quick brown fox jumped over the lazy dog.') ])]
    

    $x("//*[contains(normalize-space(.), 'The quick brown fox jumped over the lazy dog.')][not(.//*[contains(normalize-space(.), 'The quick brown fox jumped over the lazy dog.') ])]")
    

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      相关资源
      最近更新 更多