news 2026/4/22 0:34:49

【实战】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/4/22 22:52:43

前端核心知识:Vue 3 编程的 10 个实用技巧

Vue 3 编程的 10 个实用技巧 &#xff08;2025-2026 年后端转前端 / 中高级开发者最常使用的写法&#xff09; 以下 10 个技巧几乎覆盖了目前绝大部分中大型 Vue 3 项目中最实用、最能提升代码质量和开发效率的部分&#xff0c;按“日常使用频率”从高到低排序。 排名技巧名称…

作者头像 李华
网站建设 2026/4/17 16:06:47

全栈贯通,实效为先:JBoltAI全栈能力集成的落地价值

在AI技术加速渗透各行业的当下&#xff0c;企业智能化转型早已脱离“概念炒作”阶段&#xff0c;进入“实效落地”的深水区。对于Java技术团队而言&#xff0c;AI转型面临的核心难题并非缺乏先进模型&#xff0c;而是如何将分散的AI能力与现有技术体系、业务场景深度融合&#…

作者头像 李华
网站建设 2026/4/8 9:32:30

亲测好用10个AI论文软件,专科生毕业论文轻松搞定!

亲测好用10个AI论文软件&#xff0c;专科生毕业论文轻松搞定&#xff01; AI 工具让论文写作不再难 在如今的学术环境中&#xff0c;越来越多的专科生开始借助 AI 工具来提升论文写作效率。这些工具不仅能帮助学生快速生成内容&#xff0c;还能有效降低 AIGC&#xff08;人工智…

作者头像 李华
网站建设 2026/4/18 4:26:37

STM32——定时器:通用定时器

定时器归纳总页&#xff1a; STM32——定时器-CSDN博客 三、通用定时器 3.1 通用定时器简介&#xff08;F1&#xff09; 通用定时器&#xff08;F1&#xff09;&#xff1a;TIM2、3、4、5 主要特征&#xff1a; 16位 递增、递减、中心对齐计数器 16为预分频器&#xff08;预…

作者头像 李华
网站建设 2026/4/21 1:45:53

STM32——定时器:高级定时器

定时器归纳总页&#xff1a; STM32——定时器-CSDN博客 四、高级定时器 4.1 高级定时器简介 4.2 高级定时器框图&#xff08;熟悉&#xff09; 4.3 高级定时器输出指定个数PWM实验 4.3.1 重复计数器特性 再同步&#xff1a;产生于一次更新事件后&#xff0c;RCR寄存器的值会再…

作者头像 李华
网站建设 2026/4/18 9:24:03

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

(有报告)基于YOLOV8的道路缺陷检测系统有数(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 据集 (有报告)基于YOLOV8的道路缺陷检测系统 有数据集2000多张模型已经训练好直接用即可 项目介绍:软件:PycharmAnaconda环境: pytho…

作者头像 李华