我是怎么一天之内将接近八千条图文笔记从印象笔记迁移思源的

前期研究和思路

我也是一个重度的印象笔记使用者,我的印象笔记中有接近八千多条条图文笔记,所以尽管我一直有迁移到私有存储的打算,但是考虑如此庞大的迁移工作量,我一直没有动手。

直到最近有点空闲时间,又刚好看到 V2EX 论坛上有人在讨论笔记工具的话题,我尝试试了几个,最终选择了思源笔记,对我来讲因为主要有如下几个加分项

  • 完全开源,可以在 NAS 上私有化部署,此生以后再也不担心数据丢失的问题。
  • 我之前用免费版的 notion 做工作和学习调度,用印象笔记做学习和工作记录,常面临两者内容难以互相链接的问题,我发现思源笔记可以满足这一点。而且通过实践也的确如此,我现在已经将印象笔记和 notion 的内容都转移到思源笔记后,我发现使用思源融合二者完成是个正确的决定!
  • 兼容了我很多原先在 notion 和印象笔记中的使用习惯,我基本没有陡峭的学习曲线。唯一让我遗憾的是,思源的数据库没有 notion 的多个视图功能,我不得不做了些妥协。

说了那么多废话主要是感谢思源的开发者,当然我也已经用支付行动实际感谢了他们,希望他们继续完善这个产品。

话归正题,我是怎么迁移如此庞大的图文笔记的呢?我首先研究了一下以往的帖子,大部分借助其它笔记工具做转换,比如 wolai 什么的,其主要思路都是先将印象笔记转为 html,然后再由其它工具将 html 转为 markdown,再导入到思源笔记。我也尝试了一下这些工具,但是转换后笔记中都丢了图片,而我大量的笔记都是图文并茂的,所以不能接受。

所以我想,既然只有这个思路,干脆自己写一个 python 脚本做从 html 到 markdown 的转换,并修正图片文件的链接等问题,按照这个思路没想到异常顺利,在 chatGPT 的帮助下很快完工,而且转换效果不错,想到可能不少人都有同样的问题,所以共享给大家。

准备工作

  1. 安装 python,我使用的是 Python 3.12.5

  2. 安装 markdownify

    pip install markdownify

  3. 编辑一个新文件,比如叫 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 用"\\"表示目录分隔符。

执行步骤

  • 将印象笔记导出,可以按笔记本导出,我最多一次导出了几千条,注意选择"导出为多个网页文件"

    image.png

  • 打开 convert.py 文件所在的目录,点右键选择终端,并执行 python convert.py 命令。注意上面我提到到,代码中的目录 directory_path = "C:\\Users\\kursk\\Download\\notetest\\硬件" 要修改为印象笔记的导出目录(也就是第一步中的导出目录),而且 windows 用"\\"表示目录分隔符。

    执行 python 命令后,可能会提示**目录不存在,这是因为这条笔记没有图片或者对应的目录,只有一个 html 文件,是正常现象。

  • 等待命令执行完,会发现目录中多了很多 markdown 文件,每个 html 文件都会产生一个对应的 markdown 文件,注意不能移动 markdown 文件或者保持图片文件的子目录,此时不需要再移动任何文件或目录。直接打开思源笔记,在需要导入的的思源笔记本选择"导入"-"markdown 文件夹",再选择第一步的导出目录,等待思源笔记完成导入即可。

    恭喜你迁移工作完成!几个小提示:

  • 我一次完成过七条多条笔记的转换,我笔记本的配置也不高。

  • 我发现需要在思源笔记的根目录创建一个笔记本,才能选择这个笔记本进行导入,而且导入后会将文件夹名作为这个笔记本下级的一个子文件名,为了避免事后再修改子文件名(因为改名会导致思源重建索引,导致性能浪费,而且如果你此时又在大量导入,可能导致锁死数据库,我就遇到过),你导入时就可以在操作系统中创建对应的文件夹名,然后把所有的文件(注意包括 markdown 和 html 对应的目录)都要 copy 到这个文件夹下面。

作为思源新用户的问题

最后,作为一个思源的新用户,我还有一个问题请教大家

我使用笔记工具的一个习惯是先抓取微信或者网页的内容,然后对其内容添加自己的研究内容。

使用思源后,网页可以抓取,但是微信我发现必须购买思源每年的订阅才可以。但是仅仅为此一个功能每年花一百多我觉得太不划算了。

有没有其它的办法,包括做二次开发,比如开发思源的微信爬取接口,可以实现对微信的内容抓取到自己收集箱中?如果有思路或者有类似经验的同学也请提示我一下,谢谢

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22997 引用 • 92489 回帖 • 1 关注
  • 印象笔记
    3 引用 • 16 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 剪藏的目的是保留原始上下文。遇到过想看的内容被删了的情况,就知道这个痛点了。

    至于搜索,思源里单独使用一个笔记本存放剪藏的内容,真不想被干扰,关闭笔记本、排除笔记本都是可以的。

  • 其他回帖
  • Bard

    用五彩笔记,网页标注后,只存储需要的部分

    我个人偏执的认为全文收藏多数时候是没用的

    反而污染搜索结果

    如知识管理领域史诗级大佬所说:剪藏就是荼毒业界的毒瘤,带偏了后续无数的笔记软件,一直后续的软件无奈的还要被迫做这个“掏粪”工具

    1 回复
  • sagevfx

    我整理笔记基本都是在 PC 端 手机上看到的文章用 cubox 做收集箱 然后在 PC 端浏览器用插件发送到思源整理

    手机端灵感记录 用群辉的 Note Station 和微软的 OneNote 然后在电脑上转移整理

    不是最优 可以参考下

    image.png

  • Anonyrnous

    微信,您指的是公众号文章还是微信读书那些?公众号文章你是要批量导入吗?

    如果是单篇的,我都是用 PC 浏览器打开,然后用浏览器拓展来抓取。
    批量的话,目前有几个(免费)批量下载公众号文章的工具,可以下载成 HTML
    微信读书我不用,就不太了解了

  • 查看全部回帖