最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java提取HTML文本內(nèi)容的兩種輕量級(jí)實(shí)現(xiàn)方案對(duì)比

 更新時(shí)間:2026年04月27日 14:08:23   作者:缺點(diǎn)內(nèi)向  
在日常的 Java 開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到處理 HTML 內(nèi)容的場(chǎng)景,本文將介紹兩種處理思路,一種是利用第三方文檔處理庫(kù)將 HTML 作為文檔解析,另一種是主流的輕量級(jí) HTML 解析器方案,大家可以根據(jù)自己的需求進(jìn)行選擇

在日常的 Java 開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到處理 HTML 內(nèi)容的場(chǎng)景。無(wú)論是做簡(jiǎn)單的網(wǎng)頁(yè)數(shù)據(jù)抓取、處理富文本編輯器提交的內(nèi)容,還是對(duì)文檔進(jìn)行全文索引,從 HTML 中剝離標(biāo)簽、提取純文本都是一個(gè)繞不開(kāi)的基礎(chǔ)需求。

HTML 作為一種標(biāo)記語(yǔ)言,包含了大量用于控制樣式的標(biāo)簽(如 <div><span>、<p>)以及腳本代碼。如果我們直接使用正則表達(dá)式去處理這些嵌套復(fù)雜的標(biāo)簽,不僅代碼容易出錯(cuò),而且維護(hù)成本較高。

本文將介紹兩種處理思路:一種是利用第三方文檔處理庫(kù)(以 Spire.Doc for Java 為例)將 HTML 作為文檔解析;另一種是主流的輕量級(jí) HTML 解析器方案。通過(guò)對(duì)比,幫助開(kāi)發(fā)者根據(jù)自身場(chǎng)景做出合理的技術(shù)選型。

環(huán)境準(zhǔn)備

  • JDK 1.8 及以上版本
  • Maven 項(xiàng)目管理工具

1. 為什么不能直接用正則表達(dá)式?

在處理 HTML 轉(zhuǎn)文本時(shí),正則表達(dá)式是最直觀的想法,但它存在明顯的局限性:

  • 無(wú)法處理嵌套標(biāo)簽:例如 <div>a<p>b</p>c</div>,正則很難正確匹配層級(jí)關(guān)系。
  • 容易誤匹配:標(biāo)簽內(nèi)的屬性、注釋、CDATA 等特殊結(jié)構(gòu)容易干擾匹配結(jié)果。
  • 維護(hù)困難:面對(duì)不同來(lái)源的 HTML(如缺失閉合標(biāo)簽、大小寫(xiě)不一致),正則規(guī)則會(huì)變得臃腫且脆弱。

因此,推薦使用成熟的解析方案。

2. 方案一:文檔轉(zhuǎn)換器方式

該方案借助第三方文檔處理庫(kù),將 HTML 映射為文檔對(duì)象模型,然后調(diào)用獲取文本的方法。

2.1 項(xiàng)目依賴配置

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>

:該庫(kù)提供免費(fèi)版和商業(yè)版。對(duì)于基礎(chǔ)的文本提取需求,免費(fèi)版通常足夠。

2.2 核心實(shí)現(xiàn)

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. 實(shí)例化 Document 對(duì)象
        Document document = new Document();

        // 2. 加載 HTML 文件(指定格式為 Html)
        document.loadFromFile("input.html", FileFormat.Html);

        // 3. 提取純文本內(nèi)容
        String extractedText = document.getText();

        // 4. 輸出或保存結(jié)果
        System.out.println("提取的文本內(nèi)容:\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 格式。加載時(shí),庫(kù)內(nèi)部會(huì)解析 HTML 標(biāo)簽,將其映射為段落、表格等文檔元素。
  • getText() 方法遍歷文檔樹(shù),提取所有可見(jiàn)文本,同時(shí)跳過(guò)控制字符和標(biāo)簽代碼。

2.3 處理 URL 網(wǎng)頁(yè)

如果需要直接抓取線上的網(wǎng)頁(yè)內(nèi)容,可以結(jié)合 Java 原生的 HttpClient 獲取網(wǎng)頁(yè)源代碼后再解析:

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 時(shí)需遵守目標(biāo)網(wǎng)站的 robots.txt 協(xié)議及數(shù)據(jù)獲取的合規(guī)性要求。

3. 方案二:輕量級(jí) HTML 解析器方式(以 Jsoup 為例)

相比文檔轉(zhuǎn)換方式,Jsoup 是專門(mén)為 HTML 解析設(shè)計(jì)的輕量級(jí)庫(kù),在社區(qū)中使用更為廣泛。

3.1 依賴配置

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.2</version>
</dependency>

3.2 核心實(shí)現(xiàn)

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");
        
        // 提取純文本(自動(dòng)去除標(biāo)簽)
        String text = doc.text();
        
        System.out.println(text);
    }
}

Jsoup 的 text() 方法會(huì)遞歸獲取所有可見(jiàn)文本,并用空格連接塊級(jí)元素的內(nèi)容,輸出結(jié)果更適合閱讀。

3.3 直接解析 URL

Jsoup 內(nèi)置了網(wǎng)絡(luò)請(qǐng)求能力,代碼更為簡(jiǎn)潔:

Document doc = Jsoup.connect("https://example.com")
    .userAgent("Mozilla/5.0")
    .timeout(5000)
    .get();
String text = doc.text();

4. 方案對(duì)比與適用場(chǎng)景

維度文檔轉(zhuǎn)換方式(Spire.Doc)輕量級(jí)解析器(Jsoup)
設(shè)計(jì)定位文檔處理(Word、HTML 等)HTML 解析專用
API 復(fù)雜度較高(需了解 Document 模型)簡(jiǎn)單直觀
HTML 容錯(cuò)能力較強(qiáng)很強(qiáng)(業(yè)界公認(rèn))
網(wǎng)絡(luò)請(qǐng)求需自行實(shí)現(xiàn)內(nèi)置支持
依賴體積較大(包含文檔處理能力)小巧(約 500KB)
擴(kuò)展性可轉(zhuǎn)為 Word 等其他格式聚焦 HTML/CSS 選擇器

各自的適用場(chǎng)景

  • 文檔轉(zhuǎn)換方式:適合需要同時(shí)處理 Word 文檔和 HTML 文件的場(chǎng)景,或希望統(tǒng)一文檔處理邏輯的項(xiàng)目。
  • 輕量級(jí)解析器:適合純 HTML 提取、網(wǎng)頁(yè)抓取、需要按 CSS 選擇器提取特定元素內(nèi)容的場(chǎng)景。

5. 兩種方案的共同局限性

無(wú)論選擇哪種方案,在提取純文本時(shí)都需要注意以下幾點(diǎn):

  1. 格式信息丟失:提取結(jié)果僅包含文本,原 HTML 中的表格布局、字體大小、顏色、圖片鏈接等富媒體信息均會(huì)丟失。
  2. 編碼處理:如果 HTML 未正確聲明 charset,可能需要手動(dòng)指定編碼,否則可能出現(xiàn)中文亂碼。
  3. 大文件性能:對(duì)于數(shù)十 MB 的超大 HTML 文件,兩種方案的內(nèi)存占用都會(huì)顯著上升,建議分塊或流式處理。

6. 總結(jié)

從 HTML 中提取純文本是 Java 開(kāi)發(fā)中的常見(jiàn)需求。本文對(duì)比了兩種可行的技術(shù)方案:

文檔轉(zhuǎn)換方式以 Spire.Doc for Java 為例,其特點(diǎn)是將 HTML 視為文檔對(duì)象進(jìn)行解析,API 封裝程度較高,但依賴體積偏大,適合需要統(tǒng)一處理 Word 和 HTML 格式的項(xiàng)目。

輕量級(jí)解析器以 Jsoup 為例,它是專門(mén)為 HTML 設(shè)計(jì)的工具,API 簡(jiǎn)潔、HTML 容錯(cuò)能力強(qiáng),并且內(nèi)置了網(wǎng)絡(luò)請(qǐng)求支持,在社區(qū)中使用廣泛,是純文本提取場(chǎng)景下的主流選擇。

開(kāi)發(fā)者可以根據(jù)項(xiàng)目現(xiàn)有依賴、體積敏感度以及是否需要額外的 HTML 操作(如選擇器提取、DOM 修改)來(lái)選擇合適的方案。如果項(xiàng)目?jī)H需簡(jiǎn)單的去標(biāo)簽處理,Jsoup 可能是更輕量的選擇;如果項(xiàng)目中已經(jīng)引入了文檔處理相關(guān)依賴,則可以直接復(fù)用文檔轉(zhuǎn)換方式。

以上就是Java提取HTML文本內(nèi)容的兩種輕量級(jí)實(shí)現(xiàn)方案對(duì)比的詳細(xì)內(nèi)容,更多關(guān)于Java提取HTML文本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

丰城市| 昔阳县| 蛟河市| 灵川县| 普安县| 黔江区| 泰安市| 滦平县| 永平县| 浦城县| 高雄县| 漯河市| 房产| 襄汾县| 绥阳县| 营山县| 张家港市| 清河县| 象州县| 汉沽区| 淅川县| 云龙县| 乌兰浩特市| 沙雅县| 溧水县| 嘉义市| 故城县| 肇州县| 应城市| 宜州市| 麦盖提县| 临高县| 云南省| 维西| 左云县| 昭苏县| 彰武县| 淳安县| 革吉县| 从江县| 陆良县|