【问题标题】:Extracting nested text from html using xpath使用xpath从html中提取嵌套文本
【发布时间】:2015-01-16 08:00:12
【问题描述】:

我正在尝试从一个看起来像这样的 html 页面中提取文本内容:

<div class="content">
    <div class="section">
      Lorem <a href="..." class="link">ipsum</a> 
      dolor <a href="..." class="link">sit</a> amet, 
      consectetur <a href="..." class="link">adipiscing</a> elit
    </div>

    <div class="section">
      sed do <a href="..." class="link">eiusmod</a> tempor 
      incididunt <a href="..." class="link">ut</a> labore 
      et <a href="..." class="link">dolore</a>
    </div>
</div>

我只想提取文本部分:

Lorem ipsum dolor amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore

我的 XPath (2.0) 表达式是 //*[contains(@class, 'section')]。当我使用javax.xml.xpath.XPathExpression 评估它时,我只检索链接之外的文本:

Lorem dolor amet, consectetur elit, sed do tempor incididunt labore et

我以前没有使用过 XPath - 是否有更好的表达式来提取全文?谢谢。

【问题讨论】:

  • 看看JSoup。使用 XML 库评估 xpath 取决于格式良好的 XML/HTML 文件。 HTML 有时是由于浏览器无法捕捉到一些结构错误。如果您真的想为此使用 XML 库,请查看post。希望这可以帮助。问候。

标签: java html xpath


【解决方案1】:

您的表达式返回一个完整的 XML 元素。然后,您的处理器通过将 XML 元素转换为文本将其作为字符串返回,因此与您执行的基本相同

//*[contains(@class, 'section')]/text()

相比之下,您也可以使用string() 函数获取子项中的所有文本元素:

//*[contains(@class, 'section')]/string()

正如 Mathias Müller 在 cmets 中指出的那样,另一种方法是使用

//*[contains(@class, 'section')]//text()

返回所有后代或自身文本元素。

【讨论】:

  • 正确答案,+1。也许添加//*[contains(@class, 'section')]//text()does also work会很有见地?
  • @MathiasMüller 我相应地更新了我的答案 - 感谢您指出这一点。
猜你喜欢
  • 2015-07-12
  • 2020-04-19
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
相关资源
最近更新 更多