前期研究和思路
我也是一个重度的印象笔记使用者,我的印象笔记中有接近八千多条条图文笔记,所以尽管我一直有迁移到私有存储的打算,但是考虑如此庞大的迁移工作量,我一直没有动手。
直到最近有点空闲时间,又刚好看到 V2EX 论坛上有人在讨论笔记工具的话题,我尝试试了几个,最终选择了思源笔记,对我来讲因为主要有如下几个加分项
- 完全开源,可以在 NAS 上私有化部署,此生以后再也不担心数据丢失的问题。
- 我之前用免费版的 notion 做工作和学习调度,用印象笔记做学习和工作记录,常面临两者内容难以互相链接的问题,我发现思源笔记可以满足这一点。而且通过实践也的确如此,我现在已经将印象笔记和 notion 的内容都转移到思源笔记后,我发现使用思源融合二者完成是个正确的决定!
- 兼容了我很多原先在 notion 和印象笔记中的使用习惯,我基本没有陡峭的学习曲线。唯一让我遗憾的是,思源的数据库没有 notion 的多个视图功能,我不得不做了些妥协。
说了那么多废话主要是感谢思源的开发者,当然我也已经用支付行动实际感谢了他们,希望他们继续完善这个产品。
话归正题,我是怎么迁移如此庞大的图文笔记的呢?我首先研究了一下以往的帖子,大部分借助其它笔记工具做转换,比如 wolai 什么的,其主要思路都是先将印象笔记转为 html,然后再由其它工具将 html 转为 markdown,再导入到思源笔记。我也尝试了一下这些工具,但是转换后笔记中都丢了图片,而我大量的笔记都是图文并茂的,所以不能接受。
所以我想,既然只有这个思路,干脆自己写一个 python 脚本做从 html 到 markdown 的转换,并修正图片文件的链接等问题,按照这个思路没想到异常顺利,在 chatGPT 的帮助下很快完工,而且转换效果不错,想到可能不少人都有同样的问题,所以共享给大家。
准备工作
-
安装 python,我使用的是 Python 3.12.5
-
安装
markdownify
库pip install markdownify
-
编辑一个新文件,比如叫 convert.py,copy 如下内容到文件中
from markdownify import markdownify as md import os import re def convertHtmlfile2Markdownfile(input_filename): image_dir = input_filename.replace('.html', '_files/') # 生成对应的目录名 # 读取 HTML 文件 with open(input_filename, 'r', encoding='utf-8') as f: html_content = f.read() # 转换为 Markdown markdown_content = md(html_content) # 替换图片路径,确保它们指向正确的目录并替换文件名中的方括号 def replace_image_paths(markdown): return re.sub(r'src="([^"]*?)\s*\[(\d+)\]\s*"', lambda m: f'src="{image_dir}{m.group(1).strip()}-{m.group(2)}"', markdown) # 替换图片名称中的方括号 def replace_bracketed_names(markdown): return re.sub(r'(\w+)\s*\[(\d+)\]', r'\1-\2', markdown) # 先替换文件名中的方括号 markdown_content = replace_bracketed_names(markdown_content) # 然后替换图片路径 markdown_content = replace_image_paths(markdown_content) # 替换图片路径和名称中的方括号 def rename_image_files_and_replace_markdown(directory, markdown): if not os.path.exists(directory): print(f"目录 '{directory}' 不存在,跳过重命名和替换操作。") return markdown rename_map = {} for filename in os.listdir(directory): match = re.match(r'(.+?)\s*\[(\d+)\](\..+)$', filename) if match: new_name = f"{match.group(1).strip()}-{match.group(2)}{match.group(3)}" os.rename(os.path.join(directory, filename), os.path.join(directory, new_name)) rename_map[filename] = new_name for old_name, new_name in rename_map.items(): markdown = markdown.replace(old_name, new_name) return markdown # 修改目录中的图片文件名称并更新 Markdown 内容 markdown_content = rename_image_files_and_replace_markdown(image_dir, markdown_content) # 设置输出文件名 output_filename = input_filename.replace('.html', '.md') # 保存为 Markdown 文件 with open(output_filename, 'w', encoding='utf-8') as f: f.write(markdown_content) def process_directory(directory_path): for filename in os.listdir(directory_path): if filename.endswith(".html") and "_index" not in filename: input_filename = os.path.join(directory_path, filename) convertHtmlfile2Markdownfile(input_filename) directory_path = "C:\\Users\\kursk\\Download\\notetest\\硬件" # 调用函数,传入路径名称 process_directory(directory_path)
注意代码中的这一行
directory_path = "C:\\Users\\kursk\\Download\\notetest\\硬件"
要修改为印象笔记的导出目录,而且 windows 用"\\"表示目录分隔符。
执行步骤
-
将印象笔记导出,可以按笔记本导出,我最多一次导出了几千条,注意选择"导出为多个网页文件"
-
打开 convert.py 文件所在的目录,点右键选择终端,并执行
python convert.py
命令。注意上面我提到到,代码中的目录directory_path = "C:\\Users\\kursk\\Download\\notetest\\硬件"
要修改为印象笔记的导出目录(也就是第一步中的导出目录),而且 windows 用"\\"表示目录分隔符。执行 python 命令后,可能会提示**目录不存在,这是因为这条笔记没有图片或者对应的目录,只有一个 html 文件,是正常现象。
-
等待命令执行完,会发现目录中多了很多 markdown 文件,每个 html 文件都会产生一个对应的 markdown 文件,注意不能移动 markdown 文件或者保持图片文件的子目录,此时不需要再移动任何文件或目录。直接打开思源笔记,在需要导入的的思源笔记本选择"导入"-"markdown 文件夹",再选择第一步的导出目录,等待思源笔记完成导入即可。
恭喜你迁移工作完成!几个小提示:
-
我一次完成过七条多条笔记的转换,我笔记本的配置也不高。
-
我发现需要在思源笔记的根目录创建一个笔记本,才能选择这个笔记本进行导入,而且导入后会将文件夹名作为这个笔记本下级的一个子文件名,为了避免事后再修改子文件名(因为改名会导致思源重建索引,导致性能浪费,而且如果你此时又在大量导入,可能导致锁死数据库,我就遇到过),你导入时就可以在操作系统中创建对应的文件夹名,然后把所有的文件(注意包括 markdown 和 html 对应的目录)都要 copy 到这个文件夹下面。
作为思源新用户的问题
最后,作为一个思源的新用户,我还有一个问题请教大家
我使用笔记工具的一个习惯是先抓取微信或者网页的内容,然后对其内容添加自己的研究内容。
使用思源后,网页可以抓取,但是微信我发现必须购买思源每年的订阅才可以。但是仅仅为此一个功能每年花一百多我觉得太不划算了。
有没有其它的办法,包括做二次开发,比如开发思源的微信爬取接口,可以实现对微信的内容抓取到自己收集箱中?如果有思路或者有类似经验的同学也请提示我一下,谢谢
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于