前情提要:手机上从塞班开始就使用UC浏览器,那时候的UC浏览器还是相对比较好用的,现在已经变成了满屏低俗营销新闻广告的垃圾软件,终于无法忍受决定转移阵地却发现这个垃圾软件竟然不允许导出书签了,对于这种恶心用户还想提升留存的行为实在是吃相难看,嗤之以鼻。
进入正题:我的需求如题所说,将手机上的UC浏览器上百个书签导出,再导入到电脑端的Chrome浏览器中。研究一番发现电脑端的UC浏览器早已停更几年,找到了最新版安装以后发现,它可以同步手机端的书签,但是依然不允许导出,垃圾!恶心!所幸我们可以在电脑的 C:\Users\ZGR\AppData\Local\UCBrowser\ 路径下找到 Bookmarks 文件,用文本工具打开后发现正是以json格式保存的我的所有书签,核心内容如下所示(为方便查看文件可将该文件后缀改为 .json ):
如此甚好,我们只需要解析这个文件提取出书签目录和地址信息再导入到Chrome中就可以了。接下来我们在Chrome的书签管理器中导出一个书签html来分析它的文件格式,部分内容如下所示:
简单讲就是目录和链接使用固定的格式嵌套,注意这里要每一行都保留末尾的换行符,否则Chrome会解析不到部分数据,似乎是逐行解析导致的。我们只需要把前文所说的json文件内容解析出来重新组合成Chrome的嵌套格式,再插入到合适的位置保存,就可以重新导入到Chrome中了。这里我使用了Python2.7进行json和html的文本处理,为了尽量不引入额外的库硬编码了部分字符串进行分析处理,完整代码如下所示,将目录和文件名改为自己定义的即可运行,源码已上传:
import json
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
#bookmarks file which was found in C:\Users\ZGR\AppData\Local\UCBrowser\
BookmarksMobile = './Bookmarks'
#bookmarks file which was export by Chrome
BookmarksChrome = './bookmarks_chrome.html'
#output file path, the file should be imported in Chrome
OutputPath = './out_chrome.html'
FolderHtmlTag = '''<DT><H3 ADD_DATE="1625195169" LAST_MODIFIED="1632975196">{}</H3>\n'''
FolderListPre = '''<DL><p>\n'''
FolderListSuf = '''</DL><p>\n'''
UrlHtmlTag = '''<DT><A HREF="{}" ADD_DATE="1625195294">{}</A>\n'''
def ParseWriteData(file, data):
if data['type'] == 'folder':
file.write(FolderHtmlTag.format(data['name']))
file.write(FolderListPre)
for child in data['children']:
ParseWriteData(file, child)
file.write(FolderListSuf)
elif data['type'] == 'url':
file.write(UrlHtmlTag.format(data['url'],data['name']))
def BuildOutHtml(outfile):
with open(BookmarksMobile,'r') as fp:
jsonData = json.load(fp)
#print('jsonData:',jsonData)
#bookmarks on mobile
mobileData = jsonData["roots"]["synced"]
#print('mobileData:', mobileData)
ParseWriteData(outfile,mobileData)
#bookmarks on mobile
with open(BookmarksChrome,'r') as fp:
htmlData = fp.read()
#print('htmlData:',htmlData)
tail = re.search("[\n\s\t]*</DL><p>[\n\s\t]*</DL><p>[\n\s\t]*$", htmlData)
#span() return start position and end position
#group() return matched substring
#print('tail', tail.span(), tail.group())
preStrEndPos = tail.span()[0]
strPre = htmlData[0:preStrEndPos] + '\n'
strTail = htmlData[preStrEndPos:] + '\n'
#print('strTail', strTail)
with open(OutputPath,'w') as outfile:
outfile.write(strPre)
BuildOutHtml(outfile)
outfile.write(strTail)
print(OutputPath + ' finished.')
我的文件目录结构如下所示,其中out_chrome.html文件为最终的完整书签页
在Chrome中导入生成的html文件后有些书签重复了,简单拖拽调整后效果如下:
至此大功告成,卸载UC,造福百姓!!!