鱼C论坛

 找回密码
 立即注册
查看: 4421|回复: 5

[作品展示] 查找Chrome导出书签中的重复书签和书签对比功能的小工具

[复制链接]
发表于 2015-8-27 16:24:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近多台电脑的书签不同步,有许多重复的,在网上也没找到好用的工具和方法来解决,所以自己写了个小工具来解决自己这个烦恼,希望对有需要的有所帮助。
以下是简单的介绍:
主目录
1.PNG
功能1
2.PNG
功能2
3.PNG

如果使用中遇到问题欢迎回帖反馈,如有更好的书签解决方法同样欢迎跟帖分享!

代码为 python 3+
  1. #!/usr/bin/env python
  2. # Chrome 导出的 html 书签检查工具
  3. # by Hellogz 2015-08-27 shenzhen
  4. import re
  5. import os
  6. import time

  7. def find_bookmark(html, patt):
  8.     """用指定的正则表达式查找书签
  9.     参数 html: 书签字符串
  10.     参数 patt: 正则表达式
  11.     返回值: 查找到的书签列表
  12.     """
  13.     linkre = re.compile(patt)
  14.     relist = linkre.findall(html)
  15.     return relist

  16. def print_bookmark(bookmark, opt=''):
  17.     """打印书签"""
  18.     if len(bookmark):
  19.         for i in bookmark:
  20.             print('>>> Name: ' + i[1] +
  21.                   '\n>>> Url:  ' + i[0])
  22.     print('共%d条书签' %(len(bookmark)) + opt)

  23. def get_bookmark_list(file):
  24.     """获取文件中的书签"""
  25.     patt = 'HREF="(.+?)" ADD_DATE=".+?">(.+?)</A>' #查找Google书签导出html文件中的书签和书签名的url
  26.     try:
  27.         with open(file, 'r', encoding='utf-8') as f:
  28.             html = f.read()
  29.     except FileNotFoundError as exc:
  30.         print('未知的文件:文件不存在?')
  31.         return None
  32.     except UnicodeDecodeError as exc:
  33.         try:
  34.             with open(file, 'r', encoding='utf-8') as f:
  35.                 html = str(f.read(), 'utf-8')
  36.         except UnicodeDecodeError as exc:
  37.             print('无法识别的文件:%s' %(file))
  38.             return None
  39.     relist = find_bookmark(html, patt)   
  40.     print('文件:%s 共%d条书签' %(os.path.basename(file), len(relist)))
  41.     return relist

  42. def cmp_bookmark(bmk1, bmk2):
  43.     """
  44.     比较 bmk1 与 bmk2 的不同
  45.     """
  46.     dif = []    #不相同的书签
  47.    
  48.     for i in bmk1:
  49.         if i not in bmk2:
  50.             dif.append(i)
  51.     return dif

  52. def write_bookmark(bookmark, file=''):
  53.     """把 bookmark 写入指定的 file 中"""
  54.     if file is '':
  55.         file = 'bookmarks_different.txt'
  56.         
  57.     with open(file, 'a') as f:
  58.         try:
  59.             f.write(time.ctime() + '\n')
  60.             for i in bookmark:
  61.                 f.write(i[1] + '\t' + i[0] + '\n')
  62.             print('已写入到当前程序目录下的 %s 文件中' %(file))
  63.         except:
  64.             print('写入失败')

  65. def find_repeat_bookmark(bookmark_list):
  66.     """查找重复的 bookmark"""
  67.     if type(bookmark_list) is list:
  68.         repeat = []
  69.         for i in range(len(bookmark_list)):
  70.             for j in range(i + 1, len(bookmark_list)):
  71.                 if bookmark_list[i] == bookmark_list[j]:
  72.                     repeat.append((i, j))
  73.         return repeat
  74.     else:
  75.         return '出错了!请检查书签~'

  76. def check_diff():
  77.     """检查两个书签的不同之处"""
  78.     file = input('请输入文件名:')
  79.     bmk1 = get_bookmark_list(file)
  80.     if bmk1 is None:
  81.         return
  82.     file = input('请输入文件名:')
  83.     bmk2 = get_bookmark_list(file)
  84.     if bmk2 is None:
  85.         return
  86.     dif = cmp_bookmark(bmk1, bmk2)
  87.     if input('共%d条书签不相同, 打印输入"y" 其他输入将继续, 请输入:' %(len(dif))) is 'y':
  88.         print_bookmark(dif)

  89.     if input('注意:生成文件输入"y" 其他输入将继续, 请输入:') is 'y':
  90.         write_bookmark(dif)

  91. def check_repeat():
  92.     """检查书签是否有重复的"""
  93.     file = input('请输入文件名:')
  94.     bmk = get_bookmark_list(file)
  95.     repeat = find_repeat_bookmark(bmk)
  96.     if type(repeat) is str:
  97.         print(repeat)
  98.         return
  99.     if len(repeat) > 0:
  100.         if input('其中共有%d条书签重复, 打印输入"y" 其他输入将继续, 请输入:' %(len(repeat))) is 'y':
  101.             for i in repeat:
  102.                 print('>>> Name: ' + bmk[i[0]][1] +
  103.                       '\n>>> Url:  ' + bmk[i[0]][0])
  104.         return
  105.     print('共%d条书签重复' %(len(repeat)))

  106. def menu():
  107.     return input('请选择功能:\n' +
  108.           '1. 检查书签是否有重复\n' +
  109.           '2. 检查两个书签的不同之处\n' +
  110.           'exit. 退出\n' +
  111.           '请输入对应的编号:')

  112. def main():
  113.     while True:
  114.         choice = menu()
  115.         if choice == '1':
  116.             check_repeat()
  117.         elif choice == '2':
  118.             check_diff()
  119.         elif choice == 'exit':
  120.             break
  121.         else:
  122.             print('无法识别的输入, 请重新输入')

  123.     #os.system('pause')

  124. if __name__ == '__main__':
  125.     main()
  126.         
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
~风介~ + 5 + 5 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-27 17:16:03 | 显示全部楼层
正则表达式学得不错嘛!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-28 21:09:54 | 显示全部楼层
~风介~ 发表于 2015-8-27 17:16
正则表达式学得不错嘛!

差远了。。。
有个想法自己不会用正则表达式实现。。。求高手:
比如:
<h> bookmark1 <d> url1 </d> <d> url1 </d> <d> url1 </d> </h>
<h> bookmark2 <d> url2 </d> <d> url2 </d> <d> url2 </d> </h>
<h> bookmark3 <d> url3 </d> <d> url3 </d> <d> url3 </d> </h>
这里要如何一次匹配到:
bookmark1, bookmark2, bookmark3,  url1x3, url2x3, url3x3 呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-28 21:51:00 | 显示全部楼层
我是桃川人 发表于 2015-8-28 21:09
差远了。。。
有个想法自己不会用正则表达式实现。。。求高手:
比如:

这个我也不会哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-29 10:51:47 | 显示全部楼层
学习了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-19 11:51:12 | 显示全部楼层
谢谢分享~支持楼主~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表