java - JSoup获取文本而不在元素下包装标签
问题描述
如何获得以下“一些随机文本”,并用跨度包装?
例如,我有以下元素:
<div>
Some random text 1
<a href="some_url">Go to Link</a>
</div>
<div>
<span>Some random text 2</span>
<a href="some_url">Go to Link</a>
</div>
我会有这样的事情:
<div>
<span>Some random text 1</span>
<a href="some_url">Go to Link</a>
</div>
<div>
<span>Some random text 2</span>
<a href="some_url">Go to Link</a>
</div>
你看,有些 div 已经用 span 包裹了,而有些则没有。我只想包装那些没有被包装的。
解决方案
这个快速解决方案可能会对您有所帮助。我使用 jsoup v1.12.1 对其进行了测试
首先按div
标签查找所有元素,没有span
:
List<Element> elements = jsoupDocument
.getElementsByTag("div")
.stream()
.filter(div -> div.getElementsByTag("span").isEmpty())
.collect(Collectors.toList());
然后遍历找到的元素并更新它们,将其文本包装在span
标签内:
elements.forEach(div -> {
// dissect element
String text = div.ownText();
Elements children = div.children();
// clear any existing inner HTML and replace it with an empty String.
div.text("");
// put all elements back together and wrap the div text with the span tag
div.prepend(String.format("<span>%s</span>", text));
children.forEach(div::appendChild);
});
LOG.info(jsoupDocument.toString());