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的主要内容,如果未能解决你的问题,请参考以下文章