【问题标题】:using XPath: how to exclude text in nested elements使用 XPath:如何排除嵌套元素中的文本
【发布时间】:2013-08-13 20:06:53
【问题描述】:

如果我有一些像下面这样的 html

<div class=unique_id>    
  <h1 class="parseasinTitle">
    <span> Game Title </span>
 </h1>
 Game Developer
</div>

有没有办法可以使用 xpath 来获取文本的“游戏开发者”部分?通过搜索我尝试过:

//div[@class='unique_id' and not(self::h1/span)]

但这仍然给了我整个文本“游戏标题游戏开发者”。

【问题讨论】:

  • stackoverflow.com/questions/14620745/… 这是我试图遵循的示例。此人正试图获取除了最后两个

    元素中的所有文本。我认为这与我的用例相似,因为我还想要除特定标签中出现的所有文本之外的所有文本。我看到使用“自我”的错误在哪里。如果我将我的 xpath 修改为 //div[@class='unique_id']/*[not(self::h1/span)] 使用 /text() 将一无所获。

标签: html xml xpath nested


【解决方案1】:
div[@class = 'unique_id']/text()[not(normalize-space() = '')]

div[@class = 'unique_id']/text()[last()]

取决于上下文。

请注意,您仍然需要修剪生成的文本节点。

【讨论】:

  • 谢谢。使用 test() 对我不起作用-我什么也没得到(请参阅对 choroba 的回复)
  • 对不起,是说'text()'
  • 您确实在 XPath 表达式的开头使用了//
  • 是的,我正在使用它。我不知道为什么,也许只是我遇到的其他问题,但现在你的第一个解决方案正在工作(在标签选择我的 div 之后使用 /text()[not(normalize-space() = '')]。我另请注意,使用 //text() 选择 h1 中的文本而不是外部文本...有趣。你能向我解释一下你的解决方案是如何工作的吗?
  • 当然使用//text() 会选择所有后代文本节点,而不仅仅是直接子节点。我的解决方案非常简单,它读取“标准化内容不为空的所有子文本节点”。如果这对您来说更明显,您可以将其写为 text()[normalize-space(.) != '']
【解决方案2】:

方括号(“谓词”)中的条件指定节点的条件。 div 节点不是h1 同时满足否定。但是,如果您使用 child 而不是 self,这可能是您的初衷,您将不会得到预期的文本 - 您将一无所获,因为这意味着“搜索具有 unique_id tah 的 div 没有 h1/跨越孩子”。

如果你想要文本,指定 text():

//div/text()[last()]

【讨论】:

  • 谢谢,我正在尝试找到从现在开始的示例,但我找不到。我认为 child 也更有意义,但这个例子是使用 self ......我试过这个,当我使用 text() 时,我什么也没得到。这可能是因为我在这个 xpath 目标上使用的命令已经完成了从元素中获取文本的工作(像 storeText 这样的命令)。如果我使用的命令旨在从目标元素中获取文本,有没有办法可以指定它在那些嵌套标签中不获取任何内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2017-05-11
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多