使用XPath:如何排除嵌套元素中的文字

6
如果我有以下类似的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)]

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


这是我试图遵循的示例。此人试图获取除最后两个<p>元素中的文本之外的所有文本。我认为这类似于我的用例,因为我也想要除特定标签中出现的文本之外的所有文本。我看到了使用“self”的错误之处。如果我修改我的xpath为//div[@class='unique_id']/*[not(self::h1/span)]我使用/text()或not什么都没有得到。 - theFakeGramita
2个回答

7
div[@class = 'unique_id']/text()[not(normalize-space() = '')]

或者

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

根据上下文的不同,需要注意你仍然需要清除结果文本节点的空格。

谢谢。使用test()对我没有用,我什么都没得到(请参见对choroba的响应)。 - theFakeGramita
sorry, meant to say 'text()' - theFakeGramita
你在 XPath 表达式的开头使用 // 吗? - Tomalak
是的,我正在使用那个。我不确定为什么,也许只是我遇到的其他问题,但现在你的第一个解决方案有效了(在选取我的 div 后使用 /text()[not(normalize-space() = '')])。我还注意到使用 //text() 会选择 h1 中的文本而不是外部的文本......有趣。你能向我解释一下你的解决方案如何工作吗? - theFakeGramita
当然,使用//text()会选择所有后代文本节点,而不仅仅是直接子节点。我的解决方案非常简单,它读取“所有子文本节点,其规范化内容不为空”。如果这对您更明显,您可以将其编写为text()[normalize-space(.) != ''] - Tomalak

0
方括号中的条件(“谓词”)指定节点的条件。 div 节点不同时是 h1,因此否定条件得到满足。但如果您使用的是 child 而不是 self,这可能是您最初的意图,您将无法获得预期的文本 - 您将什么也得不到,因为它的意思是“搜索一个具有唯一 ID 的 div,该 div 没有 h1/span 子元素”。
如果您想要文本,请指定 text():
//div/text()[last()]

谢谢,我现在正在尝试找到那个例子,但是我找不到了。我也认为child更有意义,但是例子使用的是self...我尝试过这个,但当我使用text()时,我什么都没有得到。这可能是因为我在这个xpath目标上使用的命令已经应该从元素中获取文本(像storeText这样的命令)。如果我正在使用一个旨在从目标元素获取文本的命令,是否有一种方法可以指定它不要在这些嵌套标记中获取任何内容? - theFakeGramita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接