【问题标题】:When adding text() to my XPath, the number of results are duplicated. Why?将 text() 添加到我的 XPath 时,结果的数量是重复的。为什么?
【发布时间】:2019-03-25 18:58:14
【问题描述】:

在 Chrome 的 web 检查器中执行的以下 Xpath 返回预期的节点数,即 13 个

//*[@id="day1"]//span[contains(@class, 'day-time-clock')]

但是,当我向其中添加 text() 时:

//*[@id="day1"]//span[contains(@class, 'day-time-clock')]/text()

它返回 26 个节点。然而,只有每个其他的命中实际上都指向源代码中的某个地方,其他的只是“麻木”。

结束节点是这样的

<span class="medium bold day-time-clock">
            09:00
            <div class="tooltip-box first-free-tip ">
                <div class="tooltip-box-inner">
                    <span class="fa fa-clock-o"></span>
                    Some text
                </div>
            </div>
        </span>

上面的代码示例并没有准确地显示它在网络检查器中的外观,该节点的文本中有几个空行。这是它的真实外观的小屏幕截图。

为什么会这样?我该怎么办?

【问题讨论】:

  • 如果使用//*[@id="day1"]//span[contains(@class, 'day-time-clock')]/text()[normalize-space()]会怎样?
  • @JaSON 这似乎已经解决了 :-) 你知道为什么吗? text() 是否为每一行返回一个新值,即使它们属于同一个元素(在同一个引号内)或类似的东西?
  • 我猜你的初始 XPath 返回 2 个文本节点作为空字符串(&lt;/div&gt; 之后的那个)也是一个跨度的子文本节点。您可以使用//*[@id="day1"]//span[contains(@class, 'day-time-clock')]/text()[1] 仅选择所需的节点

标签: xpath


【解决方案1】:

您的 span 元素有多个文本节点子节点。一些文本节点子节点仅包含空格。在您的示例中,外部 span 元素具有一个包含“....09:00....”的文本节点子节点,其中“....”表示空格,以及紧跟子 div 元素之后的一个文本节点子节点. (顺便说一句,我的 HTML 是生锈的,但我不认为跨度内有一个 div 是允许的。)

您的第二个(内部)span 元素不包含文本节点,因此 /text() 应该什么都不选。

通常,在 XPath 中使用 /text() 是个坏主意,除非您有充分的理由并且确切地知道自己在做什么。

【讨论】:

  • 您知道如何避免将第二个内部跨度与 XPath 匹配吗?谢谢。
  • @michealkay 不,它没有。至少如果我将它与 text() 结合使用,则不会。
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 2013-09-20
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多