获取所有md文件中的所有外链-生成一个Chrome书签文件
Tags
#Python #MarkDown #Chrome #Obsidian #Cubox
为什么我要写这个脚本
在用Obsidian写了很多md文章之后,引用了很多的外部链接(有些在文章里面引用,有些在参考资料里面引用),但是因为国内的网络环境问题,现在很多链接都是过一阵子就没了,尤其是引用的一些个人博客的链接,他们最喜欢折腾了,经常一不小心就再也找不到原始页面了,所以呢,我迫切需要一份网页快照存档的工具,以前主要是用印象笔记收藏网页,但是感觉它有点笨重,每次都需要自己手动收藏,而且不能批量收藏。还有其它各种MarkDownLoad插件(其实这个工具也可以批量下载网页成md,但是不够方便)之类的工具,都因为不能很好的批量备份而被我排除了。
那么,现在的问题就是:
- 如何获取链接列表呢?
- 如何根据链接列表生成Chrome书签文件呢?
本文就是正则查找自己的所有md文件中的所有
[标题](链接)
格式的文本,用于获取链接列表,然后生成Chrome书签文件。关于链接列表,还有一个很常见的来源,那就是自己在各种网站的收藏夹,这一点可以查看我的另一篇文章:一个极简的WebScraper爬取数据并用Pandas处理数据的案例
有了这两种方式,那么无论是本地的,还是网络的,只要是自己可能有用的链接,我都可以备份在Cubox了。
代码实现
import os
import re
def read_file(path):
str=""
with open(path, 'r') as f:
str=f.read()
return str
def mdlink_to_chromelink(mdlink):
p = re.compile("\[(.+)\]\((http[s]?://.*)\)")
# <DT><A HREF="https://www.baidu.com/">百度一下,你就知道</A>
chromelink=re.sub(p,lambda m:f"<DT><A HREF=\"{m.group(2)}\">{m.group(1)}</A>",mdlink)
return chromelink
dir_path="/Users/yutianran/Documents/MyObsidian/1-Pulish"
list=os.listdir(dir_path)
pattern = re.compile("\[.+\]\(http[s]?://.*\)")
list_item_str=""
for item in list:
path = os.path.join(dir_path, item)
# 如果是md文件
if os.path.isfile(path) and path.endswith(".md"):
# print(item)
md=read_file(path)
find_list = pattern.findall(md)
for find_item in find_list:
chrome_link=mdlink_to_chromelink(find_item)
list_item_str=list_item_str+f" {chrome_link}\n"
chrome_template="""<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
<DT><H3 ADD_DATE="1634759143" LAST_MODIFIED="1634759173" PERSONAL_TOOLBAR_FOLDER="true">书签栏</H3>
<DL><p>
{LIST_ITEM}
</DL><p>
</DL><p>
"""
chrome_str=chrome_template.replace("{LIST_ITEM}",list_item_str)
out_path="/Users/yutianran/Documents/MyObsidian/Cache/md_all.html"
if os.path.exists(out_path):
os.remove(out_path)
file = open(out_path, "w")
file.write(chrome_str)
file.flush()
file.close()
print(f"写入到html文件成功:{out_path}")
后续的优化
现在是直接就导出Chrome书签了,以后可以再用一个文件存储链接之间的引用关系,生成一个关系图谱。 #todo
小笔记
##```python
def mdlink_to_chromelink(mdlink):
p = re.compile("[(.+)]((http[s]?://.*))")
百度一下,你就知道
chromelink=re.sub(p,lambda m:f"<A HREF="{m.group(2)}">{m.group(1)}",mdlink)
return chromelink
### python读取文件
```python
def read_file(path):
str=""
with open(path, 'r') as f:
str=f.read()
return str
python遍历本地文件夹
def dir_list(dir_path,level):
list=os.listdir(dir_path)
list.sort()
for item in list:
if item==".DS_Store" :
continue
path = os.path.join(dir_path, item)
print(" "*level+"- "+item)
if os.path.isdir(path):
dir_list(path,level+1)
elif os.path.isfile(path):
pass
else:
print("it's a special file(socket,FIFO,device file):"+path)
rootDir="/Users/yutianran/Documents/MyObsidian"
dir_list(rootDir,0)