最近在做资料整理的工作,遇到了网页书签整理的问题
然后我就想怎么样才能更方便的整理自己的书签?
后来看到自己看生财文章做的一个网页清单链接,于是就有了一个想法,我能不能把自己的网页书签导出来,然后批量整成一个表格,在这个表格里面做筛选编辑,这样会更快。
于是就有了这篇整理网页书签的思路。
整个内容分三块,第一块是方法论,第二块是实践过程,第三块是总结。
网页书签实际上就是我们在浏览网页的时候,收藏的一个快捷方式。它所包含的关键要素主要是我们备注的名字和网页的链接。
我们最需要做的就是如何对这些名字和网页的链接做高效的管理,以便之后能快速找到相应的内容。
当然一般网页它本身会自带一个title,当我们点网页收藏的时候会自动的填充title,收藏的时候就以这个title作为名字就好了。
自动收藏网页是收藏夹吃灰罪恶的开始,所以我们一定要进行网页收藏夹的整理。
但整理这件事情的过程和目的每个人都不相同,虽然我们没有办法直接生搬硬套别人的框架,但高效整理的方法是相通的。
在浏览器里边整理内容是痛苦的,要不断地进行编辑、修改,移动和删减书签。
因此就需要把它导到一个外部的平台,进行一个更高效的编辑。然后再把它同步回网页浏览器。
这是我之前的一个浏览器书签,可以看到非常的混乱,同时还会有一些重复的内容。
这是我之后整理完之后的内容,可以看到其实我对自己内容的分类的话,目前也就只分为了五类。并不像其他教程一样需要把所有的内容进行有穷分类。
每个人的需求不同,适合自己才是最好的。
这里我使用的是python代码,以下大家可以直接复制粘贴使用,需要大家把导出的书签文件和代码放到一块,同时修改代码中的bookmark变量。
- import requests
- from lxml import etree
-
- bookmark = "bookmarks_2023_6_3.html"
-
- with open(bookmark, 'r', encoding='utf-8') as f:
- contents = f.read()
-
- tree = etree.HTML(contents)
-
- # 找到所有的书签链接
- links = tree.xpath('//a')
- links = list({each.attrib['href']: each for each in links}.values())
- links.sort(key=lambda x: x.attrib['href'])
- # 打印每个链接的标题和网址
- print(len(links))
- x = []
- [x.append(f"{link.text}\t{link.attrib['href']}") for link in links]
- with open(f'{bookmark.split(".")[0]}.txt', 'w', encoding='utf-8') as f:
- f.write('\n'.join(x))
执行完代码之后,会在同级目录下出现一个以txt为后缀的文件,我只提取了书签中a标签的名字和网址,如果有其他更多的需求也可以和我聊聊。
打开文件后,内容的样式为
这个时候我们可以把内容全选复制到表格里面进行方便的浏览和筛选整理
这里我把title和url都复制到了飞书表格里面,更方便地进行处理。
对每个书签打上合适的标签,方便自己筛选。
为了能快速地做文件夹分类,我在C列以数字来代表了不同的分类。
最后整理好的表格内容,我们再把它复制到一个txt文件当中,同时执行下面的代码
- import time
- class BookmarkFolder:
- def __init__(self, name="默认", add_date=None, last_modified=None):
- self.name = str(name)
- self.add_date = int(add_date) if add_date is not None else int(time.time())
- self.last_modified = int(last_modified) if last_modified is not None else int(time.time())
- self.children = []
-
- def add_child(self, child_node):
- self.children.append(child_node)
-
- def to_xml(self):
- # 定义递归函数,用于将子节点转换为XML字符串
- def build_xml(node):
- # 如果节点是BookmarkFolder类型,将其作为文件夹处理
- if isinstance(node, BookmarkFolder):
- # 获取当前文件夹的名称和属性
- folder_name = node.name
- add_date = node.add_date
- last_modified = node.last_modified
-
- # 生成XML标签
- xml = f'<DT><H3 ADD_DATE="{add_date}" LAST_MODIFIED="{last_modified}">{folder_name}</H3>\n<DL><p>\n'
-
- # 遍历所有子节点并递归处理
- # node.children.sort(key=lambda x:x,reverse=False)
- for child_node in node.children:
- xml += build_xml(child_node)
-
- # 加上结束标签
- xml += '</DL><p>\n'
- return xml
-
- # 如果节点是字符串类型,则将其视为链接
- elif isinstance(node, str):
- link_url = node.split('\t')[0]
- link_text = node.split('\t')[-1] # 取URL路径的最后一段作为链接文本
- return f'<DT><A HREF="{link_url}">{link_text}</A>\n'
-
- # 如果节点不是BookmarkFolder或字符串类型,则抛出异常
- else:
- raise ValueError(f'Unsupported data type: {type(node)}')
-
- # 生成XML头部和根标签
- xml = '<!DOCTYPE NETSCAPE-Bookmark-file-1>'
- xml += '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">'
- xml += '<TITLE>Bookmarks</TITLE><H1>Bookmarks</H1><DL><p>\n'
-
- # 调用递归函数处理所有子节点
- for child_node in self.children:
- xml += build_xml(child_node)
-
- # 加上结束标签和换行符,返回结果
- xml += '</DL><p>\n'
- return xml
- class Bookmark:
- def __init__(self,info):
- infos = info.split('\t')
- self.name = infos[0]
- self.url = infos[1]
- self.dirs = infos[2]
- self.keywords = infos[3:]
-
- def get_class(num):
- if num == "2":
- return "1应用"
- if num == "3":
- return "2文章"
- if num=="4":
- return "3文档"
- if num=="5":
- return "4工具"
- return "0其他"
- data = []
- with open("deal.txt","r") as f:
- data = [Bookmark(x.strip()) for x in f.readlines()]
- data.sort(key=lambda x:x.keywords)
-
- files = {}
- def data_to_bookmark(data):
- root_folder = BookmarkFolder('root')
- for ele in data:
- if ele.dirs not in files:
- fd = BookmarkFolder(get_class(ele.dirs))
- files[ele.dirs] = fd
- root_folder.add_child(fd)
- keywords = f"【{'|'.join(filter(None,ele.keywords))}】 " if len(ele.keywords)>0 else ""
- files[ele.dirs].add_child(f"{ele.url}\t{keywords}{ele.name}")
- return root_folder
-
- root_folder = data_to_bookmark(data)
- root_folder.children.sort(key=lambda x:x.name)
- # 转换为 XML 字符串
- bookmarks_xml = root_folder.to_xml()
-
- # 输出结果
- print(bookmarks_xml)
- with open("import.html","w") as f:
- f.write(bookmarks_xml)
该代码打开了一个名为deal.txt的文件,文件的内容是从飞书复制的表格内容,以\t分隔的字段,包含了,名称,网址,目录,tag1,tag2,tag3,然后输出一个import.html文件。
接着把浏览器的书签全选删除清空,再通过导入的方式把新整理好的书签import.html导入进去。
最后得到如下效果,每个url我通过标签进行了一次名称排序,所以会非常整齐,用起来也很方便。
今天花了一下午的时间,主要是把书签通过解析整理,然后导出。
再导回进Chrome浏览器。其中最花时间的是对每一个标签打tag,这里面我一共671个tag,其中有446个tag因为失效或者没有价值都被我筛掉了,其他的目前只分了这几个类。
如果以后的收藏越来越多,也可能还会有其他的分类。
资料整理,有时候不是事先设计好的,而是从你个人无序的资料中长出来的,每个人都可以不一样。
在表格整理的过程中,其中有一个重要的点,就是我们一开始并不确定打哪个标签最合适。
比如同样的类型的内容,有的时候我会打工具有的时候我会打工具类,有的时候我会打编程或者是打其他的。
然后在打完标签二次整理的过程中,我们通过筛选功能把同类不同名的标签快速筛出来进行合并替换。
这就是用表格来整理书签和打标签的巨大好处。
同时,过程中也会打一些冷门的标签,这些标签我们在多次审视的过程中,可以看看能否融合到其他标签里面去,如果不能就单独开一个标签。这样就完成了强大的标签管理。
目前整个整理的过程还比较原始,需要每次导出处理再导入,在未来的设想中,它可以通过Chrome插件实现书签和其他平台的打通,这样的话,我就能够在其他的平台进行书签和tag的高效编辑,然后能自动的导回到我的Chrome书签里。
多级目录的支持,目前只支持了一级目录,还需要再进行一些代码的修改,才能支持嵌套的多级目录。
但这个不是我的常用刚需,我一般并不通过目录去检索我想要的内容,更多的是在在网页搜索框去通过关键词搜索的方式检索需要的内容。
最后,如果你有任何的心得方法,或者代码疑问和讨论