XPath为父div中的<div>选择所有文本内容,排除特定的<div>标记</div> </div>

时间:2014-07-25 10:09:39

标签: html xpath

我要查询的部分HTML:

<div class="author">   
    Tobi Raphael
    <div class="artdate"> Last Updated: 24 July 2014|16:25 GMT</div>
</div>

我只需要“Tobi Raphael”。我不想要<div class"artdate"元素。

我已尝试过以下XPath表达式,但无效:

[@class='author']/*/descendant-or-self::*[text() and not(self::div)]

我的查询有什么问题?

2 个答案:

答案 0 :(得分:1)

您应该从root或所选元素开始。

假装我们在根

/div[@class='author']/text()

这会将所有文本放在元素中,包括空文本,制表符等等......:

Text='Tobi Raphael'
Text=''

如果我们想避免那个

/div[@class='author']/text()[normalize-space(.) != '']

输出Just text:

Text='Tobi Raphael'

答案 1 :(得分:0)

您的查询存在多个问题:

  • 看起来不完整,您是否忘记在开头复制//div这样的内容?
  • 您的查询正在执行类似“选择所有作者div,然后所有子项以及包含文本节点但不是div”的所有元素节点。请改为选择文本子项。使用XPath,您不能排除子树的一部分,但需要专门匹配您想要的子树(此处:文本节点)。

选择作者div的所有直接文字儿童:

//div[@class="author"]/text()

根据您的XPath实现,您可能需要进一步过滤空文本节点:

//div[@class="author"]/text()[normalize-space(.) != ""]