在日常的 java 开发中,我们经常会遇到处理 html 内容的场景。无论是做简单的网页数据抓取、处理富文本编辑器提交的内容,还是对文档进行全文索引,从 html 中剥离标签、提取纯文本都是一个绕不开的基础需求。
html 作为一种标记语言,包含了大量用于控制样式的标签(如 <div>、<span>、<p>)以及脚本代码。如果我们直接使用正则表达式去处理这些嵌套复杂的标签,不仅代码容易出错,而且维护成本较高。
本文将介绍两种处理思路:一种是利用第三方文档处理库(以 spire.doc for java 为例)将 html 作为文档解析;另一种是主流的轻量级 html 解析器方案。通过对比,帮助开发者根据自身场景做出合理的技术选型。
环境准备:
- jdk 1.8 及以上版本
- maven 项目管理工具
1. 为什么不能直接用正则表达式?
在处理 html 转文本时,正则表达式是最直观的想法,但它存在明显的局限性:
- 无法处理嵌套标签:例如
<div>a<p>b</p>c</div>,正则很难正确匹配层级关系。 - 容易误匹配:标签内的属性、注释、cdata 等特殊结构容易干扰匹配结果。
- 维护困难:面对不同来源的 html(如缺失闭合标签、大小写不一致),正则规则会变得臃肿且脆弱。
因此,推荐使用成熟的解析方案。
2. 方案一:文档转换器方式
该方案借助第三方文档处理库,将 html 映射为文档对象模型,然后调用获取文本的方法。
2.1 项目依赖配置
在 pom.xml 中添加如下依赖:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupid>e-iceblue</groupid>
<artifactid>spire.doc</artifactid>
<version>14.3.1</version>
</dependency>
</dependencies>注:该库提供免费版和商业版。对于基础的文本提取需求,免费版通常足够。
2.2 核心实现
import com.spire.doc.document;
import com.spire.doc.fileformat;
import java.io.filewriter;
import java.io.ioexception;
public class htmltextextractor {
public static void main(string[] args) {
// 1. 实例化 document 对象
document document = new document();
// 2. 加载 html 文件(指定格式为 html)
document.loadfromfile("input.html", fileformat.html);
// 3. 提取纯文本内容
string extractedtext = document.gettext();
// 4. 输出或保存结果
system.out.println("提取的文本内容:\n" + extractedtext);
// 可选:保存到 txt 文件
try (filewriter writer = new filewriter("output.txt")) {
writer.write(extractedtext);
system.out.println("\n文本已成功保存到 output.txt");
} catch (ioexception e) {
e.printstacktrace();
}
}
}
代码解析:
document类通常用于处理 word 文档,但它同样支持fileformat.html格式。加载时,库内部会解析 html 标签,将其映射为段落、表格等文档元素。gettext()方法遍历文档树,提取所有可见文本,同时跳过控制字符和标签代码。
2.3 处理 url 网页
如果需要直接抓取线上的网页内容,可以结合 java 原生的 httpclient 获取网页源代码后再解析:
import com.spire.doc.document;
import com.spire.doc.fileformat;
import java.io.*;
import java.net.url;
import java.net.urlconnection;
public class urltextextractor {
public static void main(string[] args) {
string urlstr = "https://example.com";
try {
string htmlpath = fetchhtmlfromurl(urlstr, "temp.html");
document doc = new document();
doc.loadfromfile(htmlpath, fileformat.html);
string text = doc.gettext();
system.out.println(text);
} catch (exception e) {
e.printstacktrace();
}
}
private static string fetchhtmlfromurl(string urlstring, string savepath) throws exception {
url url = new url(urlstring);
urlconnection conn = url.openconnection();
conn.setconnecttimeout(5000);
conn.setrequestproperty("user-agent", "mozilla/5.0");
try (bufferedreader reader = new bufferedreader(new inputstreamreader(conn.getinputstream(), "utf-8"));
filewriter writer = new filewriter(savepath)) {
string line;
while ((line = reader.readline()) != null) {
writer.write(line);
writer.write("\n");
}
}
return savepath;
}
}
注意:解析 url 时需遵守目标网站的 robots.txt 协议及数据获取的合规性要求。
3. 方案二:轻量级 html 解析器方式(以 jsoup 为例)
相比文档转换方式,jsoup 是专门为 html 解析设计的轻量级库,在社区中使用更为广泛。
3.1 依赖配置
<dependency>
<groupid>org.jsoup</groupid>
<artifactid>jsoup</artifactid>
<version>1.17.2</version>
</dependency>3.2 核心实现
import org.jsoup.jsoup;
import org.jsoup.nodes.document;
import java.io.file;
public class jsoupextractor {
public static void main(string[] args) throws exception {
// 加载 html 文件
document doc = jsoup.parse(new file("input.html"), "utf-8");
// 提取纯文本(自动去除标签)
string text = doc.text();
system.out.println(text);
}
}
jsoup 的 text() 方法会递归获取所有可见文本,并用空格连接块级元素的内容,输出结果更适合阅读。
3.3 直接解析 url
jsoup 内置了网络请求能力,代码更为简洁:
document doc = jsoup.connect("https://example.com")
.useragent("mozilla/5.0")
.timeout(5000)
.get();
string text = doc.text();
4. 方案对比与适用场景
| 维度 | 文档转换方式(spire.doc) | 轻量级解析器(jsoup) |
|---|---|---|
| 设计定位 | 文档处理(word、html 等) | html 解析专用 |
| api 复杂度 | 较高(需了解 document 模型) | 简单直观 |
| html 容错能力 | 较强 | 很强(业界公认) |
| 网络请求 | 需自行实现 | 内置支持 |
| 依赖体积 | 较大(包含文档处理能力) | 小巧(约 500kb) |
| 扩展性 | 可转为 word 等其他格式 | 聚焦 html/css 选择器 |
各自的适用场景:
- 文档转换方式:适合需要同时处理 word 文档和 html 文件的场景,或希望统一文档处理逻辑的项目。
- 轻量级解析器:适合纯 html 提取、网页抓取、需要按 css 选择器提取特定元素内容的场景。
5. 两种方案的共同局限性
无论选择哪种方案,在提取纯文本时都需要注意以下几点:
- 格式信息丢失:提取结果仅包含文本,原 html 中的表格布局、字体大小、颜色、图片链接等富媒体信息均会丢失。
- 编码处理:如果 html 未正确声明
charset,可能需要手动指定编码,否则可能出现中文乱码。 - 大文件性能:对于数十 mb 的超大 html 文件,两种方案的内存占用都会显著上升,建议分块或流式处理。
6. 总结
从 html 中提取纯文本是 java 开发中的常见需求。本文对比了两种可行的技术方案:
文档转换方式以 spire.doc for java 为例,其特点是将 html 视为文档对象进行解析,api 封装程度较高,但依赖体积偏大,适合需要统一处理 word 和 html 格式的项目。
轻量级解析器以 jsoup 为例,它是专门为 html 设计的工具,api 简洁、html 容错能力强,并且内置了网络请求支持,在社区中使用广泛,是纯文本提取场景下的主流选择。
开发者可以根据项目现有依赖、体积敏感度以及是否需要额外的 html 操作(如选择器提取、dom 修改)来选择合适的方案。如果项目仅需简单的去标签处理,jsoup 可能是更轻量的选择;如果项目中已经引入了文档处理相关依赖,则可以直接复用文档转换方式。
以上就是java提取html文本内容的两种轻量级实现方案对比的详细内容,更多关于java提取html文本的资料请关注代码网其它相关文章!
发表评论