You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jsoup将未被其他标签分隔的连续同标签包裹为指定div

使用Jsoup包裹连续<p>标签为<div class="test">

要实现识别HTML中未被其他标签分隔的连续<p>标签,并将每组连续的<p>用<div class="test">包裹,可按以下步骤操作:

核心思路

  1. 定位目标父容器(如示例中的<body>),获取其所有直接子节点
  2. 遍历子节点,将连续的<p>标签归为同一组
  3. 为每组连续<p>创建<div class="test">元素,把组内<p>移入该div
  4. 用新div替换原位置的连续<p>标签

代码实现

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import java.util.ArrayList;
import java.util.List;

public class WrapContinuousPTags {
    public static void main(String[] args) {
        // 示例HTML内容
        String html = "<body>\n" +
                "    <p>123124</p>\n" +
                "    <p>214565</p>\n" +
                "    <p>123333</p>\n" +
                "    <img src = \"aboba\"/>\n" +
                "    <p>faaaa</p>\n" +
                "    <p>aaaaa</p>\n" +
                "    <a href=\"src\"></a>\n" +
                "    <p>1111</p>\n" +
                "</body>";

        Document doc = Jsoup.parse(html);
        Element body = doc.body();

        // 复制子节点列表避免遍历过程中原列表变化影响循环
        List<Node> children = new ArrayList<>(body.childNodes());
        int i = 0;

        while (i < children.size()) {
            Node current = children.get(i);
            // 跳过非元素节点和非<p>标签的元素
            if (!(current instanceof Element) || !"p".equals(((Element) current).tagName())) {
                i++;
                continue;
            }

            // 收集连续的<p>标签
            List<Node> continuousPs = new ArrayList<>();
            while (i < children.size()) {
                Node node = children.get(i);
                if (node instanceof Element && "p".equals(((Element) node).tagName())) {
                    continuousPs.add(node);
                    i++;
                } else {
                    break;
                }
            }

            // 创建包裹用的div
            Element wrapDiv = doc.createElement("div");
            wrapDiv.addClass("test");

            // 将连续<p>移入div
            for (Node p : continuousPs) {
                wrapDiv.appendChild(p);
            }

            // 将div插入到原连续<p>的起始位置
            continuousPs.get(0).before(wrapDiv);
        }

        // 输出处理后的HTML
        System.out.println(doc.body().html());
    }
}

测试示例

输入HTML:

<body>
    <p>123124</p>
    <p>214565</p>
    <p>123333</p>
    <img src = "aboba"/>
    <p>faaaa</p>
    <p>aaaaa</p>
    <a href="src"></a>
    <p>1111</p>
</body>

处理后输出:

<div class="test">
    <p>123124</p>
    <p>214565</p>
    <p>123333</p>
</div>
<img src="aboba">
<div class="test">
    <p>faaaa</p>
    <p>aaaaa</p>
</div>
<a href="src"></a>
<div class="test">
    <p>1111</p>
</div>

注意事项

  • 代码默认处理父容器的直接子元素,若需处理嵌套在其他元素内的<p>,可调整选择器或遍历逻辑
  • Jsoup会自动修正不规范的HTML语法(如示例中<img>标签的闭合)
  • 操作过程中保留了原标签的格式与内容,仅做包裹替换

内容的提问来源于stack exchange,提问作者Jake Morgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:57:33