当前位置: 代码网 > it编程>编程语言>Java > Java提取HTML文本内容的两种轻量级实现方案对比

Java提取HTML文本内容的两种轻量级实现方案对比

2026年04月27日 Java 我要评论
在日常的 java 开发中,我们经常会遇到处理 html 内容的场景。无论是做简单的网页数据抓取、处理富文本编辑器提交的内容,还是对文档进行全文索引,从 html 中剥离标签、提取纯文本都是一个绕不开

在日常的 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. 两种方案的共同局限性

无论选择哪种方案,在提取纯文本时都需要注意以下几点:

  1. 格式信息丢失:提取结果仅包含文本,原 html 中的表格布局、字体大小、颜色、图片链接等富媒体信息均会丢失。
  2. 编码处理:如果 html 未正确声明 charset,可能需要手动指定编码,否则可能出现中文乱码。
  3. 大文件性能:对于数十 mb 的超大 html 文件,两种方案的内存占用都会显著上升,建议分块或流式处理。

6. 总结

从 html 中提取纯文本是 java 开发中的常见需求。本文对比了两种可行的技术方案:

文档转换方式以 spire.doc for java 为例,其特点是将 html 视为文档对象进行解析,api 封装程度较高,但依赖体积偏大,适合需要统一处理 word 和 html 格式的项目。

轻量级解析器以 jsoup 为例,它是专门为 html 设计的工具,api 简洁、html 容错能力强,并且内置了网络请求支持,在社区中使用广泛,是纯文本提取场景下的主流选择。

开发者可以根据项目现有依赖、体积敏感度以及是否需要额外的 html 操作(如选择器提取、dom 修改)来选择合适的方案。如果项目仅需简单的去标签处理,jsoup 可能是更轻量的选择;如果项目中已经引入了文档处理相关依赖,则可以直接复用文档转换方式。

以上就是java提取html文本内容的两种轻量级实现方案对比的详细内容,更多关于java提取html文本的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com