如何使用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
相关产品推荐
相关产品推荐

