处理谷歌浏览器导出书签为json格式
前言
最近在发现一个开源的网址导航的开源项目 Webstack网址导航 还不错, 其实就是一个类似hao123导航类似,
里面的内容是可以自己自定义的, 这不禁让我想到可以吧浏览器的书签导出来,然后放到项目里面去就可以把自己收藏的书签变成一个自己的导航网址,说干就干。
网址导航
开源作者支持部署方式有很多, 所以我这里就采用VUE开发构建的方式,因为这种相对来说比较简单,而且不需要部署后台服务, 有一个简单的NGINX即可
vue项目地址为 WebStack-vue, 也可以直接看我的成品(弄得比较随意,能看就行)
–>网址导航demo 其中vue有一个D:\project\WebStack-vue\src\assets\data.json
文件,这里面存的就是导航列表所需要的数据,
所以我们本次的目的也就是将谷歌浏览器导出的书签,生成一个data.json
文件即可,
data.json文件格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| [ { "name": "主目录", "children": [ { "name": "子目录1", "children": [], "web": [ { "url": "", "title": "", "desc": "", "logo": "" } ] } ], "web": [ { "url": "", "title": "", "desc": "", "logo": "" } ] } ]
|
谷歌浏览器书签
导出书签
在设书签栏点击书签管理器
或者直接在浏览器地址栏输入chrome://bookmarks/
可以直接进入到书签管理,右上角导出书签就可以得到一个Bookmark.html
的书签文件,其实就是一段简单的html代码
原理
既然我们知道书签其实就是一段简单的html代码, 我们就可以直接对html操作,使用js将html里面的dom对象处理成我们能接受的json格式的字符串就可以满足我们的需求,具体逻辑请看代码,不做过多赘述。
demo
点这里可以预览效果
代码
代码又两个版本, 一个是Java
版本的,另外一个是JavaScript
版本的,这里先展示JavaScript
版本的
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
| <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>处理导出的谷歌浏览器书签</title> <style> * { width: 100%; height: 100%; margin: 0; padding: 0; }
.body { height: 100%; }
.box { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; }
button { width: 100px; height: 60px; border-radius: 6px; background: #cccfff; border: 0px; }
input { width: 20%; height: 5%; border: 0px #cccfff solid; text-align: center; border-radius: 6px; margin-bottom: 10px; font-size: 30px; } </style> </head> <body> <div class="body"> <div class="box"> <input type="file" id="file"> <button id="btn" onclick="submit()">确定</button> </div> </div> </body> <script>
function submit() { var file = document.getElementById("file").files[0]; if (file.name.indexOf(".html") < 0) { alertErr() return } file.text().then(res => { let doms = parseToDOM(res); for (const dom of doms) { if (dom.tagName == 'DL') { let result = textHandle(dom, null); exportRaw('data.json', JSON.stringify(result.children)) } } }) }
function exportRaw(name, data) { var urlObject = window.URL || window.webkitURL || window; var export_blob = new Blob([data]); var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a") save_link.href = urlObject.createObjectURL(export_blob); save_link.download = name; var ev = document.createEvent("MouseEvents"); ev.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); save_link.dispatchEvent(ev); }
function alertErr() { alert("请不要上传非谷歌浏览器书签文件") }
function textHandle(dl, temp) { let dts = getDts(dl); if (dts.length > 0) { for (var i in dts) { let dt = dts[i], hdl = getTag(dt, "DL"); if (hdl != null) { let h = getTag(dt, "H3"); let returns = textHandle(hdl, {name: h.textContent, children: [], web: []}) if (temp == null) { temp = returns; } else { temp.children.push(returns); } } else { var a = getTag(dt, "A"); temp.web.push({ url: a.href, title: a.textContent, desc: a.textContent, logo: a.getAttribute("ICON") }) } } } return temp; }
function getTag(dt, tagname) { let dtcs = dt.children, obj = null; if (dtcs.length < 1) { return obj } for (let dtc of dtcs) { if ((dtc.tagName.toUpperCase()) == tagname) { obj = dtc; break; } } return obj; }
function getDts(dl) { let dlcs = dl.children, arr = []; if (dlcs.length < 1) { return arr; } for (let dlc of dlcs) { if ((dlc.tagName.toUpperCase()) == 'DT') { arr.push(dlc) } } return arr; }
function parseToDOM(str) { let div = document.createElement("div"); if (typeof str == "string") { div.innerHTML = str; } return div.childNodes; }
</script> </html>
|
Java
待完善
结尾
目前只对谷歌浏览器的书签做了处理,还不知道其他浏览器的书签格式是怎么样的, 当然如果有兴趣也可以对代码稍微改造,便能得到其他浏览器的书签导入格式, 总而言之,处理谷歌浏览器的书签还是比较简单的,不足之处欢迎指出