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

如何使用Jsoup提取带正确换行的HTML文档完整文本?

Jsoup提取HTML文本时保留换行的解决方案

你当前使用doc.body().text()提取文本会得到单行内容,是因为Jsoup的text()方法会自动拼接所有文本节点,忽略HTML元素的换行结构,仅用空格分隔不同文本块。要保留合适的换行,可参考以下几种方案:

方案一:递归遍历DOM,根据块级元素插入换行

通过递归遍历HTML节点,识别块级元素(如<p>、<div>、<li>等),在这些元素的前后插入换行符,同时保留文本内容的结构:

import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import java.util.Arrays;

public class JsoupTextExtractor {
    public static String getFormattedText(Element element) {
        StringBuilder sb = new StringBuilder();
        for (Node node : element.childNodes()) {
            if (node instanceof TextNode) {
                // 添加文本内容,去除首尾空白
                sb.append(((TextNode) node).text().trim());
            } else if (node instanceof Element) {
                Element el = (Element) node;
                String tag = el.tagName().toLowerCase();
                // 块级元素前添加换行
                if (isBlockElement(tag)) {
                    sb.append("\n");
                }
                // 递归处理子元素
                sb.append(getFormattedText(el));
                // 块级元素后添加换行
                if (isBlockElement(tag)) {
                    sb.append("\n");
                }
            }
        }
        // 合并连续换行,避免多余空行
        return sb.toString().replaceAll("\\n+", "\n").trim();
    }

    private static boolean isBlockElement(String tag) {
        return Arrays.asList("p", "div", "h1", "h2", "h3", "h4", "h5", "h6",
                            "ul", "ol", "li", "blockquote", "pre", "hr").contains(tag);
    }
}

调用方式:

String formattedText = JsoupTextExtractor.getFormattedText(doc.body());
System.out.println(formattedText);

方案二:替换HTML标签为换行符(简单快速)

通过正则替换将块级标签和<br>标签转换为换行符,再提取纯文本,适合对格式要求不高的场景:

// 获取body的HTML内容
String html = doc.body().html();

// 将块级标签替换为换行
html = html.replaceAll("</?(p|div|h[1-6]|ul|ol|li|blockquote|pre)\\s*>", "\n");
// 将<br>标签替换为换行
html = html.replaceAll("<br\\s*/?>", "\n");

// 解析处理后的HTML为纯文本,再清理多余换行
String text = Jsoup.parse(html).text().replaceAll("\\n+", "\n").trim();
System.out.println(text);

方案三:保留<br>标签的换行

如果仅需要保留<br>标签的换行,可先将<br>替换为换行文本节点,再提取文本:

// 给所有<br>标签添加换行文本节点
doc.select("br").append("\n");
// 提取文本,此时<br>对应的换行会被保留
String text = doc.body().text().replaceAll("\\s+", " ").replace("\n ", "\n");
System.out.println(text);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:15:45