java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java浏览器书签HTML转JSON

Java使用Jsoup实现将浏览器书签HTML转换为JSON

作者:weixin_46244623

这篇文章主要介绍了如何使用Jsoup和Fastjson2将浏览器导出的书签HTML文件解析为层级化的JSON结构,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下

一、背景说明

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

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

二、书签 HTML 格式说明

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

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

关键点:

三、技术选型

技术作用
Jsoup解析 HTML DOM
Fastjson2构建 JSON 数据
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 内容
        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 结构 {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": []
    }
  ]
}

六、实现思路总结

到此这篇关于Java使用Jsoup实现将浏览器书签HTML转换为JSON的文章就介绍到这了,更多相关Java浏览器书签HTML转JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文