news 2026/6/10 3:53:20

【实战】Java使用 Jsoup 将浏览器书签 HTML 转换为 JSON(支持多级目录)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【实战】Java使用 Jsoup 将浏览器书签 HTML 转换为 JSON(支持多级目录)

一、背景说明

浏览器(Chrome / Edge / Firefox)导出的书签文件,通常是Netscape Bookmark HTML 格式
在实际开发中,我们可能会遇到以下需求:

  • 将浏览器书签导入到自己的系统
  • 对书签进行结构化存储(如数据库、JSON)
  • 做书签导航站、搜索、同步工具等

本文通过Jsoup + Fastjson2,演示如何将书签 HTML解析为层级 JSON 结构,并支持递归子目录


二、书签 HTML 格式说明

浏览器导出的书签文件大致结构如下:

<DL><DT><H3>文件夹</H3><DL><DT><AHREF="https://www.baidu.com/">百度</A><DT><H3>子文件夹</H3><DL><DT><AHREF="https://map.baidu.com/">百度地图</A></DL></DL></DL>

关键点:

  • <H3>:表示一个文件夹
  • <A>:表示一个书签链接
  • <DL>:表示当前文件夹的内容
  • 文件夹与其内容是H3 → 紧跟的 DL

三、技术选型

技术作用
Jsoup解析 HTML DOM
Fastjson2构建 JSON 数据
JUnit + SpringBootTest测试运行

四、完整示例代码

下面给出完整可运行代码,包括导入、类定义和递归方法:

packagecom.nav.test;importcom.alibaba.fastjson2.JSONArray;importcom.alibaba.fastjson2.JSONObject;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;@SpringBootTest@RunWith(SpringRunner.class)publicclassBookmark{@Testpublicvoidmain(){// 模拟浏览器导出的书签 HTML 内容StringbookmarkContent="<!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 解析 HTMLDocumentdoc=Jsoup.parse(bookmarkContent);// 找到书签栏(Chrome 的 PERSONAL_TOOLBAR_FOLDER)ElementmainFolder=doc.select("h3[personal_toolbar_folder]").first();// 递归处理JSONObjectresult=processFolder(mainFolder);// 输出 JSONSystem.out.println(result.toJSONString());}/** * 递归处理文件夹 * * @param folderElement 文件夹对应的 H3 元素 * @return JSONObject 结构 {name, links, subFolders} */privatestaticJSONObjectprocessFolder(ElementfolderElement){JSONObjectfolderJson=newJSONObject();// 文件夹名称folderJson.put("name",folderElement.text());// 当前文件夹对应的 <DL>Elementdl=folderElement.nextElementSibling();// 当前目录下的链接JSONArraylinks=newJSONArray();for(Elementa:dl.select("> dt > a")){JSONObjectlinkJson=newJSONObject();linkJson.put("name",a.text());linkJson.put("url",a.attr("href"));links.add(linkJson);}folderJson.put("links",links);// 子文件夹JSONArraysubFolders=newJSONArray();for(Elementh3:dl.select("> dt > h3")){subFolders.add(processFolder(h3));}folderJson.put("subFolders",subFolders);returnfolderJson;}}

五、输出 JSON 示例

运行上面的代码,控制台输出类似:

{"name":"书签栏","links":[{"name":"百度一下,你就知道","url":"https://www.baidu.com/"}],"subFolders":[{"name":"子书签","links":[{"name":"百度地图","url":"https://map.baidu.com/"}],"subFolders":[]}]}

六、实现思路总结

  1. H3 表示文件夹
  2. H3 后面的 DL 是内容
  3. 使用nextElementSibling()关联目录
  4. 递归解析子文件夹
  5. 通过> dt > a> dt > h3选择器分别获取当前目录的书签和子文件夹
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:26:58

基于SpringBoot+Vue技术的菜谱交流平台的设计与实现

基于Spring Boot Vue技术的菜谱交流平台的设计与实现 引言 菜谱交流平台是一个典型的社交与内容分享应用&#xff0c;旨在让用户分享、学习和讨论各种菜谱&#xff0c;促进厨艺爱好者之间的互动。该平台采用前后端分离架构&#xff0c;后端使用Spring Boot&#xff08;高效、…

作者头像 李华
网站建设 2026/6/10 11:28:24

基于深度学习yolov8的智能车牌识别系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于深度学习yolov8的智能车牌识别系统设计(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 如今智能交通系统中的车牌识别技术被广泛使用&#xff0c;在交通管制、监控安防、智能泊车等方面都有着良好的应用前景。但是传统车…

作者头像 李华
网站建设 2026/6/10 11:27:38

基于YOLOv8+pyqt5的火焰烟雾检测系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于YOLOv8pyqt5的火焰烟雾检测系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 基于YOLOv8pyqt5的火焰烟雾检测系统&#xff0c;标价即售价内含21527张火焰烟雾数据集包含smoke&#xff0c;fire&#xff0c;2类也可自行替…

作者头像 李华
网站建设 2026/5/25 1:26:34

JavaEE要想学得好,【Java spring】少不了,稳扎稳打学JavaEE

JavaEE要想学得好&#xff0c;【Spring全家桶】绝对少不了&#xff01; 稳扎稳打学JavaEE的正确姿势&#xff08;2026年最实用路线&#xff09; 一句话总结当前真实情况&#xff1a; JavaEE ≠ Servlet JSP 了 现在的JavaEE ≈ Spring全家桶 云原生 分布式技术栈 绝大多数…

作者头像 李华
网站建设 2026/6/10 11:29:17

基于 Spring Boot 的 Web 三大核心交互案例精讲

基于 Spring Boot 的 Web 三大核心交互案例精讲 &#xff08;2026年最实用写法 企业真实场景&#xff09; 在 Spring Boot Web 开发中&#xff0c;真正决定项目质量和维护难度的&#xff0c;往往不是写了多少 Controller&#xff0c;而是你是否真正掌握了以下三大核心交互场景…

作者头像 李华