在动态html结构中使用xpath获取文本

时间:2013-07-28 19:12:34

标签: html dom xpath

我有很多html并希望通过xpath处理它。文本可以有两种可能的方式出现:

<div>
  The Text
</div>
<!-- OR -->
<div>
  <span>The Text</span>
</div>
<!-- BUT NOT -->
<div> other text
  <span>The Text</span>
</div> other text

有没有办法可以使用单个xpath表达式获取“文本”?

修改

具体结构:

<div id="content">
<h1>...</h1>
<div>
    ...
</div>
<div>
    <span>The Text</span>
</div>

我通过//div[@id='content'][1]获取内容节点,并将其重复用于其他目的。在此上下文节点上,我尝试执行./div[2]/span/text() | ./div[not(span)][2]/text()。如果没有span,它可以工作,但如果有一个spawn,则返回blank / null。我正在使用Java xpath实现。 div始终是内容节点的第二个。

1 个答案:

答案 0 :(得分:1)

div/span/text() | div[not(span)]/text()

应该做的伎俩。这将选择<span>的子项(如果有<span>)的文本节点,以及<div>的子项的文本节点(如果没有<span>}

您必须修改div部分以反映您正在评估XPath表达式的上下文。如果您想对文档中的所有<div>元素执行此操作,请将div更改为//div

更新

根据您发布的新上下文信息,上述XPath应修改为:

./div[2]/span/text() | ./div[2][not(span)]/text()

但是,当有<span>元素时,我不明白为什么你的版本没有返回任何文本。你能给出更多的上下文 - 你正在评估XPath的java代码;也许是输入HTML的更详细的片段?样本输入HTML是否真正准确地代表了您的实际输入?可能会有另一个</div>在那里被忽视吗?