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

Java使用Jsoup實現(xiàn)將瀏覽器書簽HTML轉(zhuǎn)換為JSON

 更新時間:2026年01月18日 08:59:19   作者:weixin_46244623  
這篇文章主要介紹了如何使用Jsoup和Fastjson2將瀏覽器導出的書簽HTML文件解析為層級化的JSON結(jié)構(gòu),文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以了解下

一、背景說明

瀏覽器(Chrome / Edge / Firefox)導出的書簽文件,通常是 Netscape Bookmark HTML 格式。
在實際開發(fā)中,我們可能會遇到以下需求:

  • 將瀏覽器書簽導入到自己的系統(tǒng)
  • 對書簽進行結(jié)構(gòu)化存儲(如數(shù)據(jù)庫、JSON)
  • 做書簽導航站、搜索、同步工具等

本文通過 Jsoup + Fastjson2,演示如何將書簽 HTML 解析為層級 JSON 結(jié)構(gòu),并支持 遞歸子目錄。

二、書簽 HTML 格式說明

瀏覽器導出的書簽文件大致結(jié)構(gòu)如下:

<DL>
  <DT><H3>文件夾</H3>
  <DL>
    <DT><A  rel="external nofollow" >百度</A>
    <DT><H3>子文件夾</H3>
    <DL>
      <DT><A  rel="external nofollow" >百度地圖</A>
    </DL>
  </DL>
</DL>

關(guān)鍵點:

  • <H3>:表示一個文件夾
  • <A>:表示一個書簽鏈接
  • <DL>:表示當前文件夾的內(nèi)容
  • 文件夾與其內(nèi)容是 H3 → 緊跟的 DL

三、技術(shù)選型

技術(shù)作用
Jsoup解析 HTML DOM
Fastjson2構(gòu)建 JSON 數(shù)據(jù)
JUnit + SpringBootTest測試運行

四、完整示例代碼

下面給出 完整可運行代碼,包括導入、類定義和遞歸方法:

package com.nav.test;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class Bookmark {

    @Test
    public void main() {
        // 模擬瀏覽器導出的書簽 HTML 內(nèi)容
        String bookmarkContent = "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" +
                "<!-- This is an automatically generated file. -->\n" +
                "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n" +
                "<TITLE>Bookmarks</TITLE>\n" +
                "<H1>Bookmarks</H1>\n" +
                "<DL><p>\n" +
                "    <DT><H3 ADD_DATE=\"1632971641\" LAST_MODIFIED=\"1689686797\" PERSONAL_TOOLBAR_FOLDER=\"true\">書簽欄</H3>\n" +
                "    <DL><p>\n" +
                "        <DT><A HREF=\"https://www.baidu.com/\" ADD_DATE=\"1689686710\">百度一下,你就知道</A>\n" +
                "        <DT><H3 ADD_DATE=\"1689686747\" LAST_MODIFIED=\"1689686798\">子書簽</H3>\n" +
                "        <DL><p>\n" +
                "            <DT><A HREF=\"https://map.baidu.com/\" ADD_DATE=\"1689686769\">百度地圖</A>\n" +
                "        </DL><p>\n" +
                "    </DL><p>\n" +
                "</DL><p>";

        // 使用 Jsoup 解析 HTML
        Document doc = Jsoup.parse(bookmarkContent);

        // 找到書簽欄(Chrome 的 PERSONAL_TOOLBAR_FOLDER)
        Element mainFolder = doc.select("h3[personal_toolbar_folder]").first();

        // 遞歸處理
        JSONObject result = processFolder(mainFolder);

        // 輸出 JSON
        System.out.println(result.toJSONString());
    }

    /**
     * 遞歸處理文件夾
     *
     * @param folderElement 文件夾對應的 H3 元素
     * @return JSONObject 結(jié)構(gòu) {name, links, subFolders}
     */
    private static JSONObject processFolder(Element folderElement) {
        JSONObject folderJson = new JSONObject();

        // 文件夾名稱
        folderJson.put("name", folderElement.text());

        // 當前文件夾對應的 <DL>
        Element dl = folderElement.nextElementSibling();

        // 當前目錄下的鏈接
        JSONArray links = new JSONArray();
        for (Element a : dl.select("> dt > a")) {
            JSONObject linkJson = new JSONObject();
            linkJson.put("name", a.text());
            linkJson.put("url", a.attr("href"));
            links.add(linkJson);
        }
        folderJson.put("links", links);

        // 子文件夾
        JSONArray subFolders = new JSONArray();
        for (Element h3 : dl.select("> dt > h3")) {
            subFolders.add(processFolder(h3));
        }
        folderJson.put("subFolders", subFolders);

        return folderJson;
    }
}

五、輸出 JSON 示例

運行上面的代碼,控制臺輸出類似:

{
  "name": "書簽欄",
  "links": [
    {
      "name": "百度一下,你就知道",
      "url": "https://www.baidu.com/"
    }
  ],
  "subFolders": [
    {
      "name": "子書簽",
      "links": [
        {
          "name": "百度地圖",
          "url": "https://map.baidu.com/"
        }
      ],
      "subFolders": []
    }
  ]
}

六、實現(xiàn)思路總結(jié)

  • H3 表示文件夾
  • H3 后面的 DL 是內(nèi)容
  • 使用 nextElementSibling() 關(guān)聯(lián)目錄
  • 遞歸解析子文件夾
  • 通過 > dt > a> dt > h3 選擇器分別獲取當前目錄的書簽和子文件夾

到此這篇關(guān)于Java使用Jsoup實現(xiàn)將瀏覽器書簽HTML轉(zhuǎn)換為JSON的文章就介紹到這了,更多相關(guān)Java瀏覽器書簽HTML轉(zhuǎn)JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC實現(xiàn)多文件上傳

    SpringMVC實現(xiàn)多文件上傳

    這篇文章主要為大家詳細介紹了SpringMVC實現(xiàn)多文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • java中運算符使用步驟(超詳細!)

    java中運算符使用步驟(超詳細!)

    Java中的運算符是編程語言中最基本的組成部分,對于數(shù)據(jù)的操作和處理起著至關(guān)重要的作用,這篇文章主要介紹了java中運算符使用步驟的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • Java多線程產(chǎn)生死鎖的必要條件

    Java多線程產(chǎn)生死鎖的必要條件

    今天小編就為大家分享一篇關(guān)于Java多線程產(chǎn)生死鎖的必要條件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中的延遲隊列DelayQueue詳細解析

    Java中的延遲隊列DelayQueue詳細解析

    這篇文章主要介紹了Java中的延遲隊列DelayQueue詳細解析,JDK自身支持延遲隊列的數(shù)據(jù)結(jié)構(gòu),其實類:java.util.concurrent.DelayQueue,<BR>我們通過閱讀源碼的方式理解該延遲隊列類的實現(xiàn)過程,需要的朋友可以參考下
    2023-12-12
  • Java來實現(xiàn)文本轉(zhuǎn)圖片需求示例

    Java來實現(xiàn)文本轉(zhuǎn)圖片需求示例

    本文主要介紹了Java來實現(xiàn)文本轉(zhuǎn)圖片需求示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • 淺析Spring?Cloud?Gateway中的令牌桶限流算法

    淺析Spring?Cloud?Gateway中的令牌桶限流算法

    這篇文章主要為大家淺析了Spring?Cloud?Gateway中的令牌桶限流算法原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • Struts2實現(xiàn)自定義攔截器的三種方式詳解

    Struts2實現(xiàn)自定義攔截器的三種方式詳解

    這篇文章主要介紹了Struts2實現(xiàn)自定義攔截器的三種方式詳解,一些與系統(tǒng)邏輯相關(guān)的通用功能如權(quán)限的控制和用戶登錄控制等,需要通過自定義攔截器實現(xiàn),本節(jié)將詳細講解如何自定義攔截器,需要的朋友可以參考下
    2023-07-07
  • java集合map取key使用示例 java遍歷map

    java集合map取key使用示例 java遍歷map

    這篇文章主要介紹了java集合map取key使用示例,需要的朋友可以參考下
    2014-02-02
  • SpringBoot中開啟GZIP壓縮的方式

    SpringBoot中開啟GZIP壓縮的方式

    這篇文章主要介紹了SpringBoot中開啟GZIP壓縮的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring中@Qualifier注解的用法

    Spring中@Qualifier注解的用法

    但凡有點開發(fā)經(jīng)驗,多多少少可能都遇到過@Qualifier注解的使用場景,本文主要介紹了Spring中@Qualifier注解的用法,感興趣的可以了解一下
    2023-11-11

最新評論

瓦房店市| 合肥市| 石林| 山东省| 阿拉善右旗| 临沧市| 冕宁县| 霍山县| 鄯善县| 山丹县| 龙游县| 富平县| 锡林浩特市| 临漳县| 松阳县| 文登市| 措勤县| 香港 | 五家渠市| 德江县| 宕昌县| 镇原县| 攀枝花市| 宣武区| 封开县| 凤庆县| 宁乡县| 石屏县| 桃源县| 新昌县| 武夷山市| 巨野县| 永德县| 新田县| 霍邱县| 和硕县| 阿拉尔市| 岳池县| 家居| 武平县| 手机|