【问题标题】:Locating a web element using xPath by text is split across several spans通过文本使用 xPath 定位 Web 元素分为多个跨度
【发布时间】:2014-05-07 14:11:08
【问题描述】:

有人可以帮我找到一个 xPath,它可以根据它的文本定位一个元素,它被分成几个跨度?当我使用 text() 函数时,它似乎只能找到元素文本的起始序列,直到第一个跨度。

例如,在以下场景中,我只想找到第一个 <h5> 而不是另一个。也就是找一个元素,显示一个文本“A xxx B”

...
<h5>
A
<span>xxx</span>
B
</h5>
...
<h5>
A
<span>xxx</span>
C
</h5>

【问题讨论】:

  • 我不清楚你的标准是什么:你在寻找包含“A where B”的h5吗?
  • 是的,这是一个例子。问题是我不知道在 后面的 h5 中找到文本的一部分,其中 B 或 C 可能是,这是我需要区分这两个元素的信息。
  • 你能分享一下,我的解决方案有什么问题吗?谢谢。

标签: html xpath html-parsing


【解决方案1】:

试试这个:

h5[1]

您可以使用索引选择集合中的某个项目。

【讨论】:

  • 谢谢,但我的只是一个例子。实际上,我无法预测我需要的标题索引。元素可以按任何顺序出现。它的文本是我唯一可以依赖的相关定位器。
【解决方案2】:

使用descendant-or-self::node() 从h5 标记中获取整个文本,使用normalize-space() 处理换行符和空格:

//h5[normalize-space(descendant-or-self::node()) = 'A xxx B']

演示(使用xmllint):

$ xmllint index.html --xpath "//h5[normalize-space(descendant-or-self::node()) = 'A xxx B']"
<h5>
    A
    <span>xxx</span>
    B
</h5>

其中index.html 包含:

<div>
    <h5>
        A
        <span>xxx</span>
        B
    </h5>
    ...
    <h5>
        A
        <span>xxx</span>
        C
    </h5>
</div>

【讨论】:

    【解决方案3】:

    您可以匹配所有h5,并且仅在节点满足特定条件时复制/对节点执行任何操作。这个条件是检查最后一个文本节点(或第二个[2]),它是否等于某个硬编码的字符串。您可能需要使用normalize-space() 来消除文本节点中的空白:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="/">
        <result>
          <xsl:apply-templates select="root/h5"/>
        </result>
      </xsl:template>
    
    
      <xsl:template match="h5">
        <xsl:if test="normalize-space(./text()[last()]) = 'C'">
          <xsl:copy-of select="."/>
        </xsl:if>
      </xsl:template>
    </xsl:stylesheet>
    

    结果:

    <?xml version="1.0" encoding="utf-8"?>
    <result>
      <h5>
        A
        <span>xxx</span>
        C
      </h5>
    </result>
    

    【讨论】:

    • 谢谢。我不知道有可能(并且在这种情况下是必要的)索引单个元素内的文本。对我来说,使用索引可能是最简单的解决方案。
    【解决方案4】:

    类似情况:

    <button title="Create New" accesskey="N">
    Create
    <span class="X">N</span>
    ew
    </button>
    

    它创建带有文本“新建”的按钮。 要找到此按钮,您可以使用

     //button[descendant-or-self::* = 'Create New']
    

    这是 alecxe 答案的简单版本(如果里面没有空间)

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 2023-03-25
      • 1970-01-01
      • 2018-08-08
      • 2021-08-21
      • 1970-01-01
      • 2021-08-20
      • 2021-04-25
      • 1970-01-01
      相关资源
      最近更新 更多