首页 > 解决方案 > 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 包裹了,而有些则没有。我只想包装那些没有被包装的。

标签: javahtmljsoup

解决方案


这个快速解决方案可能会对您有所帮助。我使用 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());

推荐阅读