使用Jsoup将未被其他标签分隔的连续同标签包裹为指定div
使用Jsoup包裹连续
<p>标签为<div class="test"> 要实现识别HTML中未被其他标签分隔的连续<p>标签,并将每组连续的<p>用<div class="test">包裹,可按以下步骤操作:
核心思路
- 定位目标父容器(如示例中的
<body>),获取其所有直接子节点 - 遍历子节点,将连续的
<p>标签归为同一组 - 为每组连续
<p>创建<div class="test">元素,把组内<p>移入该div - 用新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
相关产品推荐
相关产品推荐

