一、引言

在 Java 开发中,从 HTML 文件中剔除标签、样式、脚本等冗余信息、提取核心纯文本,是数据清洗、全文索引、AI 训练数据准备等场景下的高频需求。面对嵌套复杂的 HTML 标签,使用正则表达式处理不仅容易出错,维护成本也相当高。因此,借助成熟的解析库是更可靠的选择。

本文详细介绍如何使用 Free Spire.Doc for Java 这一免费库来实现 HTML 文本提取。


二、实现原理

Free Spire.Doc for Java 本身是围绕 Word 文档的段落、节、表格等元素设计的文档处理库。当调用 loadFromFile 方法并指定 FileFormat.Html 时,库内部会将 HTML 标签、样式和文本映射到自己的文档对象模型中。随后调用 getText() 方法,库会遍历整个文档树,将所有可见文本节点的内容拼接并返回,同时自动过滤掉HTML标签以及 <script><style> 等标签内的内容。

这种方式本质上是一种 “将 HTML 解析为富文本再提取纯文本”的桥接方案,开发者无需手动编写解析逻辑。


三、环境准备

3.1 Maven 配置

在项目的 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.free</artifactId>
<version>14.3.1</version>
</dependency>
</dependencies>

注意spire.doc.free 为免费版,对于基础的文本提取需求,免费版已足够。

3.32Gradle 配置

implementation 'e-iceblue:spire.doc.free:14.3.1@jar'

四、基础实现:从 HTML 文件提取文本

4.1 完整示例代码

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import java.io.FileWriter;
import java.io.IOException;

public class ExtractTextFromHTML {
public static void main(String[] args) {
// 1. 创建 Document 对象(核心入口)
Document doc = new Document();

// 2. 加载 HTML 文件(指定格式为 Html)
doc.loadFromFile("Sample.html", FileFormat.Html);

// 3. 获取提取的纯文本
String text = doc.getText();

// 4. 将文本写入输出文件(使用 try-with-resources 确保资源安全释放)
try (FileWriter fileWriter = new FileWriter("HTMLText.txt")) {
fileWriter.write(text);
System.out.println("文本提取完成,已保存至 HTMLText.txt");
} catch (IOException e) {
System.err.println("写入文件失败:" + e.getMessage());
}
}
}

4.2 代码解析

  1. loadFromFile 方法接收两个参数:文件路径和文件格式。FileFormat.Html 告诉库按HTML方式解析输入
  2. getText() 返回文档中所有文本内容的字符串,HTML 标签被完全剥离,换行符和空格按内部规则保留

五、进阶用法:从 URL 提取文本

如果需要从网络上的 HTML 页面提取文本,可以先通过 HTTP 请求获取 HTML 内容并保存为临时文件,再执行提取。

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;

public class ExtractTextFromURL {
public static void main(String[] args) throws IOException {
// 1. 从URL读取HTML并保存为临时文件
String htmlFilePath = downloadHtmlFromUrl("https://example.com/article");

// 2. 创建Document对象并加载HTML文件
Document doc = new Document();
doc.loadFromFile(htmlFilePath, FileFormat.Html);

// 3. 提取文本
String text = doc.getText();

// 4. 保存结果
try (FileWriter writer = new FileWriter("URLText.txt")) {
writer.write(text);
System.out.println("从URL提取文本完成");
}
}

/**
* 从指定URL下载HTML内容并保存为本地临时文件
* @param urlString 目标URL
* @return 临时文件的路径
*/

private static String downloadHtmlFromUrl(String urlString) throws IOException {
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(10000);

String tempFilePath = "temp_page.html";
try (InputStream inputStream = connection.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader);
FileWriter fileWriter = new FileWriter(tempFilePath)) {

String line;
while ((line = bufferedReader.readLine()) != null) {
fileWriter.write(line);
fileWriter.write(System.lineSeparator());
}
}
return tempFilePath;
}
}

注意:实际生产环境中建议使用 java.net.http.HttpClient(JDK 11+)或 Apache HttpClient 等更成熟的 HTTP 客户端库,并妥善处理字符编码、重定向、超时等细节。


六、从 HTML 字符串提取文本

如果 HTML 内容已经以字符串形式存在于内存中(例如来自数据库或用户输入),也可以直接解析:

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import java.io.ByteArrayInputStream;

public class ExtractTextFromHtmlString {
public static void main(String[] args) {
String htmlContent = "<html><body><h1>标题</h1><p>这是一段正文内容。</p></body></html>";

Document doc = new Document();
// 将字符串转换为字节输入流加载
doc.loadFromStream(new ByteArrayInputStream(htmlContent.getBytes()), FileFormat.Html);

String text = doc.getText();
System.out.println("提取的文本:\n" + text);
}
}


七、注意事项与局限性

7.1 文本布局简化

getText() 返回的文本不保证保留原始HTML中的表格结构、缩进或列表符号。对于需要保持格式的提取任务(如表格转 CSV),此方法可能不适用。

7.2 JavaScript 和 CSS 的处理

库在加载 HTML 时会忽略 <script><style> 标签内的内容。实际测试表明,getText() 基本只提取可见文本节点,不会输出脚本或样式代码,提取结果较为干净。

7.3 免费版功能限制

免费版本适合轻量级的 HTML 文本提取需求,例如:

  • 网页内容采集与清洗
  • 全文索引的数据准备
  • 文本分析/自然语言处理的预处理
  • 内容归档与存储

7.4 字符编码

加载 HTML 文件时,请确保文件的字符编码与内容匹配。如果 HTML 文件包含非 UTF-8 编码的中文等内容,可能需要在使用 loadFromFile 之前进行编码转换处理。


八、方案对比:Free Spire.Doc vs Jsoup

在 Java 生态中,提取 HTML 文本还有另一种主流方案——使用 Jsoup 这样的轻量级 HTML 解析器。两者对比如下:

对比维度Free Spire.Doc for JavaJsoup
设计定位文档处理(Word/HTML 互转)HTML 解析专用
API 风格文档对象模型(段落、节、表格)DOM + CSS 选择器(类 jQuery 语法)
HTML 容错能力较强很强(业界公认)
文本提取代码量极少(3-4行)较少(需选择器定位)
额外功能支持 HTML 转W ord/PDF 等支持 CSS 选择器、XPath、HTTP 客户端
适用场景需要文档格式转换+文本提取纯 HTML 解析、网页爬虫

选型建议

  • 如果只需要提取纯文本,且希望代码最简洁,Free Spire.Doc 是一个不错的选择
  • 如果需要进行复杂的 HTML 结构解析(如按 CSS 选择器提取特定元素),Jsoup 更灵活强大
  • 如果同时有HTML 转 Word/PDF等文档处理需求,Free Spire.Doc 更具优势

九、小结

使用 Free Spire.Doc for Java 提取 HTML 文本,核心代码仅有寥寥数行——通过 Document 对象的 loadFromFilegetText 两个方法即可完成。这种方式避免了手动编写 HTML 解析器的复杂工作,适合快速实现文本提取需求的开发场景。

在实际项目中,建议根据具体需求(如是否需要保留格式、是否需要处理动态网页、是否需要文档格式转换等)综合评估,选择最适合的技术方案。