【问题标题】:Fetching text with xpath in dynamic html structure在动态 html 结构中使用 xpath 获取文本
【发布时间】:2013-07-29 23:41:25
【问题描述】:

我有很多 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] 获取 content 节点并将其重用于其他目的。在这个上下文节点上,我尝试执行./div[2]/span/text() | ./div[not(span)][2]/text()。如果没有跨度,它可以工作,但如果有生成,则返回空白/null。我正在使用 Java xpath 实现。 div 始终是 content-node 的第二个。

【问题讨论】:

  • 获取 div 并读取其 textContent 属性
  • 显示您尝试过的 XPath、结果是什么以及它与您想要的结果有何不同会很有帮助。

标签: html dom xpath


【解决方案1】:
div/span/text() | div[not(span)]/text()

应该可以解决问题。这将选择作为&lt;span&gt; 子级的文本节点(如果有&lt;span&gt;),以及作为&lt;div&gt; 子级的文本节点(如果没有&lt;span&gt;)。

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

更新:

根据你发布的新上下文信息,上面的XPath应该修改为:

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

但是,当有 &lt;span&gt; 元素时,我不明白为什么您的版本不返回任何文本。您能否提供更多上下文 - 您正在评估 XPath 的 Java 代码;也许您的输入 HTML 的更详细的 sn-p?示例输入 HTML 真的完全代表您的实际输入吗?会不会有另一个 &lt;/div&gt; 被忽视?

【讨论】:

  • 我添加了一个更好更具体的例子,LarsH
  • 终于可以用了,谢谢。我不确定问题出在哪里,我可以发誓我已经试过了......
  • @cara:它可能是为了面子开始起作用的,再次有人开始关注它。 :-)
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2015-07-12
  • 2020-12-19
  • 2015-11-06
  • 2013-01-15
  • 2019-04-11
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多