
HTML 解析是 Java 开发中的一项关键任务,它能够帮助开发者提取结构化数据、分析内容,并与网页信息进行交互。无论你是在构建网页爬虫、验证 HTML 内容,还是从网页中提取文本与属性,一个可靠的工具都能大幅简化开发流程。
本文将介绍如何使用 Spire.Doc for Java 在 Java 中解析 HTML。它不仅提供强大的 HTML 解析能力,还能无缝结合文档处理功能,帮助开发者以更低代码量完成复杂任务。
- 为什么使用 Spire.Doc for Java 解析 HTML
- 环境准备与安装
- 核心指南:在 Java 中解析 HTML 并提取元素
- 进阶场景:在 Java 中解析 HTML 文件与 URL
- HTML 解析 FAQs
为什么使用 Spire.Doc for Java 解析 HTML
虽然 Java 中有很多 HTML 解析库(例如 Jsoup),但 Spire.Doc 在“文档处理集成”和“低代码工作流”方面具有明显优势,非常适合追求开发效率的开发者。
以下是它在 Java HTML 解析场景中的几个优势:
直观的对象模型: HTML 转换为可遍历的文档结构(例如:节(Section)、段落(Paragraph)、表格(Table)),无需手动解析原始 HTML 标签。
全面的数据提取:可以轻松提取文本、属性、表格行/单元格,甚至样式(例如标题),无需额外的依赖项。
低代码工作流:只需少量代码即可加载并处理 HTML 内容,大幅降低开发成本。
轻量级集成:支持通过 Maven 或 Gradle 快速集成到 Java 项目中,依赖简单。
环境准备与安装
在 Java 中读取 HTML 前,请确保开发环境满足以下要求:
- Java 开发工具包(JDK):版本 8 或更高(推荐 JDK 11+,以便在 URL 解析时支持 HttpClient)。
- Spire.Doc for Java 库:最新版(可通过 Maven 或手动下载集成)。
- HTML 源代码:一个用于测试提取的 HTML 字符串、本地文件或 URL 示例。
安装 Spire.Doc for Java
Maven 配置:在项目的 pom.xml 中添加仓库与依赖:
{maven spire-doc}
添加后,Maven 会自动下载所需库及依赖。
如果你更倾向于手动安装,也可以从官网下载 JAR 文件后添加到项目中。
获取临时许可证(可选)
默认情况下,Spire.Doc 会在输出结果中添加评估版水印。如果希望移除水印并解锁完整功能,可以申请 30 天的免费试用许可证。
核心指南:在 Java 中解析 HTML 并提取元素
Spire.Doc 会将 HTML 解析为结构化对象模型,其中段落、表格、字段等元素都能作为 Java 对象进行访问。
下面通过几个实用示例演示如何提取 HTML 中的关键内容。
1. 在 Java 中提取 HTML 文本
提取纯文本(不含 HTML 标签与格式)是内容索引、数据分析等场景中的常见需求。
下面示例演示如何解析 HTML 字符串并提取所有段落文本。
Java 代码:从 HTML 字符串中提取文本
import com.spire.doc.*;
import com.spire.doc.documents.*;
public class ExtractTextFromHtml {
public static void main(String[] args) {
// 定义 HTML 内容
String htmlContent = "<html>" +
"<body>" +
"<h1>Spire.Doc for Java 功能介绍" +
"<p>Spire.Doc for Java 是一款专业的 Word 文档处理组件,无需安装 Microsoft Office。</p>" +
"<ul>" +
"<li>支持创建、读取、修改 Word 文档</li>" +
"<li>支持 HTML 与 Word 相互转换</li>" +
"<li>支持 PDF、EPUB、图片等格式转换</li>" +
"</ul>" +
"<p>更多详情请访问:www.e-iceblue.com</p>" +
"</body>" +
"</html>";
// 创建 Document 对象
Document doc = new Document();
// 将 HTML 字符串解析到文档中
doc.addSection().addParagraph().appendHTML(htmlContent);
// 提取所有段落文本
StringBuilder extractedText = new StringBuilder();
for (Section section : (Iterable<Section>) doc.getSections()) {
for (Paragraph paragraph : (Iterable<Paragraph>) section.getParagraphs()) {
extractedText.append(paragraph.getText()).append("\n");
}
}
// 输出结果
System.out.println("Extracted Text:\n" + extractedText);
}
}
输出结果

2. 在 Java 中提取 HTML 表格数据
HTML 表格通常用于存储结构化数据(例如商品列表、报表等)。Spire.Doc 将 <table> 标签解析为 Table 对象,因此可以非常方便地提取行列数据。
Java 代码:提取 HTML 表格行与单元格
import com.spire.doc.*;
import com.spire.doc.documents.*;
public class ExtractTableFromHtml {
public static void main(String[] args) {
// 包含表格的 HTML 内容
String htmlWithTable = "<html>" +
"<body>" +
"<h2>Spire.Doc for Java 产品价格表</h2>" +
"<table border='1'>" +
"<tr><th>产品版本</th><th>授权类型</th><th>价格(美元)</th></tr>" +
"<tr><td>标准版</td><td>单开发者授权</td><td>$599</td>" +
"<tr><td>专业版</td><td>团队授权</td><td>$1,499</td></tr>" +
"<tr><td>企业版</td><td>无限授权</td><td>$2,999</td></tr>" +
"</table>" +
"</body>" +
"</html>";
// 解析 HTML
Document doc = new Document();
doc.addSection().addParagraph().appendHTML(htmlWithTable);
// 提取表格数据
for (Section section : (Iterable<Section>) doc.getSections()) {
for (Object obj : section.getBody().getChildObjects()) {
if (obj instanceof Table) {
Table table = (Table) obj;
System.out.println("Table Data:");
// 遍历行
for (TableRow row : (Iterable<TableRow>) table.getRows()) {
// 遍历单元格
for (TableCell cell : (Iterable<TableCell>) row.getCells()) {
// 提取单元格文本
for (Paragraph para : (Iterable<Paragraph>) cell.getParagraphs()) {
System.out.print(para.getText() + "\t");
}
}
System.out.println();
}
}
}
}
}
}
输出结果:

通过 appendHTML() 方法将 HTML 字符串解析为 Word 文档后,你还可以利用 Spire.Doc 的 API 提取文本或图片等内容。
进阶场景:在 Java 中解析 HTML 文件与 URL
除了 HTML 字符串外,Spire.Doc for Java 还支持解析本地 HTML 文件和 Web URL,使其适用于各种真实业务场景。
1. 在 Java 中读取 HTML 文件
要解析本地 HTML 文件,只需通过 loadFromFile(String filename, FileFormat.Html) 方法加载它即可进行处理。
Java 代码:读取并解析本地 HTML 文件
import com.spire.doc.*;
import com.spire.doc.documents.*;
public class ParseHtmlFile {
public static void main(String[] args) {
// 创建 Document 对象
Document doc = new Document();
// 加载 HTML 文件
doc.loadFromFile("input.html", FileFormat.Html);
// 提取文本
StringBuilder text = new StringBuilder();
for (Section section : (Iterable<Section>) doc.getSections()) {
for (Paragraph para : (Iterable<Paragraph>) section.getParagraphs()) {
text.append(para.getText()).append("\n");
}
}
System.out.println("Text from HTML File:\n" + text);
}
}
该示例会从加载的 HTML 文件中提取文本内容。如果你需要同时获取段落样式(例如 "Heading1"、"Normal"),可以使用 Paragraph.getStyleName() 方法。
输出结果:

你可能还需要:在 Java 中将 HTML 转换为 Word
2. 在 Java 中解析网页 URL
在真实爬虫或网页分析场景中,你通常需要从在线网页中获取 HTML 内容。Spire.Doc 可以结合 Java 内置的 HttpClient(JDK 11+)来抓取网页 HTML 并进行解析。
Java 代码:抓取并解析网页 URL
import com.spire.doc.*;
import com.spire.doc.documents.*;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ParseHtmlFromUrl {
// 可复用 HttpClient
private static final HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
public static void main(String[] args) {
String url = "https://business.segmentfault.com/about";
try {
// 获取 HTML 内容
System.out.println("Fetching from: " + url);
String html = fetchHtml(url);
// 使用 Spire.Doc 解析 HTML
Document doc = new Document();
Section section = doc.addSection();
section.addParagraph().appendHTML(html);
System.out.println("--- Headings ---");
// 提取标题
for (Paragraph para : (Iterable<Paragraph>) section.getParagraphs()) {
if (para.getStyleName() != null &&
para.getStyleName().startsWith("Heading")) {
System.out.println(para.getText());
}
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
// 获取 HTML 内容
private static String fetchHtml(String url) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("User-Agent", "Mozilla/5.0")
.timeout(Duration.ofSeconds(10))
.GET()
.build();
HttpResponse<String> response =
httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// 检查请求状态
if (response.statusCode() != 200) {
throw new Exception("HTTP error: " + response.statusCode());
}
return response.body();
}
}
关键步骤:
HTTP 请求:使用 HttpClient 抓取网页 HTML,并通过 User-Agent 模拟浏览器访问,避免被服务器拦截。
HTML 解析:创建 Document 对象后,添加一个 Section 和一个 Paragraph,然后 appendHTML() 加载获取到的 HTML 内容。
内容提取:通过检查段落样式是否以 "Heading" 开头来提取网页标题。
输出结果:

总结
借助 Spire.Doc for Java 库可以简化在 Java 中解析 HTML 的过程。借助它,你可以用最少的代码从 HTML 字符串、本地文件或 URL 中提取文本、表格和数据,而无需手动处理复杂 HTML 标签或引入沉重依赖。
无论你是在构建网页爬虫、分析 Web 内容,还是将 HTML 转换为其他格式(例如 HTML 转 PDF),Spire.Doc 都能帮助你快速构建稳定、高效的 HTML 处理流程。
HTML 解析 FAQs
问题1:Java 中哪个 HTML 解析库最好?
答:这取决于你的需求:
- 如果你需要提取文本、表格,并结合文档处理(例如 HTML 转 PDF),推荐使用 Spire.Doc。
- 如果只需要基础 HTML 解析,可以选择 Jsoup,但提取表格和文本通常需要更多代码。
问题2:Spire.Doc 如何处理格式错误或结构不规范的 HTML?
答:Spire.Doc for Java 提供了专门的方式来处理不规范 HTML,使用 loadFromFile 方法配合 XHTMLValidationType.None 参数。此配置会禁用严格的 XHTML 验证,从而更宽容地解析不规范 HTML。
// 加载并解析格式错误的 HTML 文件
// 参数:文件路径,文件格式(HTML),验证类型(None)
doc.loadFromFile("input.html", FileFormat.Html, XHTMLValidationType.None);
不过,如果 HTML 结构严重损坏,仍可能导致解析失败。
问题3:可以修改解析后的 HTML 内容并重新保存为 HTML 吗?
答:可以。Spire.Doc 支持修改解析后的内容(例如编辑段落文本、删除表格行或新增元素),然后重新保存为 HTML。
// 将 HTML 解析到 Document 对象后:
Section section = doc.getSections().get(0);
Paragraph firstPara = section.getParagraphs().get(0);
firstPara.setText("Updated heading!"); // 修改文本
// 保存回 HTML
doc.saveToFile("modified.html", FileFormat.Html);
问题4:使用 Spire.Doc 解析 HTML 是否需要联网?
答:不需要,除非你是直接从 URL 加载 HTML。Spire.Doc 可以在没有网络连接的情况下解析本地文件或字符串中的 HTML。只有在从网页 URL 抓取 HTML 时,才需要网络连接来获取网页内容,而解析过程本身仍然可以离线完成。







