Jsoup:在无 CSS 的 HTML 中提取两个块之间的所有 HTML

Posted

技术标签:

【中文标题】Jsoup:在无 CSS 的 HTML 中提取两个块之间的所有 HTML【英文标题】:Jsoup: Extract all HTML between two blocks in CSS-less HTML 【发布时间】:2011-11-10 06:54:15 【问题描述】:

使用 Jsoup 提取符合此模式的两个块之间的所有 html(到字符串、文档或元素)的最佳方法是什么:

<strong>
 any HTML could appear here, except for a <strong> pair
</strong>

 ...
 This is the HTML I need to extract. 
  any HTML could appear here, except for a <strong> pair
 ... 

<strong>
 any HTML could appear here, except for a <strong> pair
</strong>

如果我在整个 body.html() 上应用正则表达式,这可能很简单:

(<strong>.+</strong>)(.+)(<strong>.+</strong>)
                       ^
                       +----- There I have my HTML content

但正如我从similar challenge 中了解到的那样,如果我使用已经 Jsoup 解析的 DOM,性能可能会有所提高(即使代码稍长)——除了这次 Element.nextSibling()Element.nextElementSibling() 都不能来救援。

例如,我在 Jsoup 中搜索了类似 jQuery 的 nextUntil 的东西,但实际上找不到类似的东西。

是否有可能提出比上述基于正则表达式的方法更好的方法?

【问题讨论】:

从 DOM 中提取的 HTML 是否与原始字符串不同有关系吗?因为通常像 jsoup 这样的 HTML 清理器可以更改(修复)DOM,因此后续的 DOM->HTML 转换将导致字符串与您的原始字符串不同。在这些情况下,正则表达式可能更安全。 为什么不干脆用jsoup的select方法把所有元素都提取出来,然后把第一个和最后一个扔掉? 这个怎么样:***.com/questions/6534456/… 这两个 是兄弟姐妹吗? 【参考方案1】:

我不知道它是否更快,但也许这样的东西会起作用:

Elements strongs = doc.select("strong");
Element f = strongs.first();
Element l = strongs.last();
Elements siblings = f.siblingElements();
List<Element> result = siblings.subList(siblings.firstIndexOf(f) + 1,siblings.lastIndexOf(l));

【讨论】:

以上是关于Jsoup:在无 CSS 的 HTML 中提取两个块之间的所有 HTML的主要内容,如果未能解决你的问题,请参考以下文章

Jsoup简明教程

jsoup 提取 html 中的所有链接图片和媒体

如何使用 Jsoup 从表格中提取文本

java 常用的解析工具

java爬——jsoup使用教程

如何使用 Jsoup 提取单独的文本节点?