メインコンテンツへスキップ
見出し画像
Photo by5ynthaire

備忘録|NoteデータのエクスポートとMD化

    Noteで記事を書きながらAIとコラボレーションをしていると、過去記事を直ぐに貼り付けられるように手元に置きたくなりますよね。(URL貼り付け?知らんがな 笑 RAGのノイズ混入とかURLのキャッシュ化が心配なんや。AIも直貼りが確実て言うとる)

    下書きや最終版をマメに保存できる人ならいいのですが、Noteのエディタが便利すぎて(?)私のように直打ちからの勢いでそのまま投稿する人も多いんじゃないかと思います。

    そして気が付けば膨大な記事量にドラフト(私はAIアシスタントのログを残すのに使っています)が溜まっていて、欲しい情報がすぐに取り出せない状況が出来上がっている。

    そんな悩みを解決する方法を紹介します。


    パーソナルデータ・ソブリニティ

    【定義】各個人がプラットフォームに分散した自己のデータ(メール、チャット、成果物)を、一か所に集約し管理すること。

    【意義】AI時代のデータ容量爆発と、プラットフォーム側の無責任により、「何を」「いつ」「何のために」が各所に分散した状態にある。過去の記録を辿るのが難しく、AIとのコラボレーションにおいて支障をきたす。個人が責任をもって自身の知恵と成果を資産化しなくてはならない。

    【方法論】一か所集約と、プラットフォーム・アーカイブを使用可能な形への変換。

    筆者の造語

    1|Noteのエクスポート手順

    投稿済み+ドラフト記事は以下の手順で、一括エクスポートできます:

    Note公式Help

    noteヘルプセンター> その他のヘルプ> インポート・エクスポート> エクスポート機能の使い方


    2|MD(マークダウン)変換

    エクスポートされたデータは記事とアカウント情報が一つのXML、画像などの埋め込みデータがサブフォルダに一式入っています。

    そのままでは使いにくいですが、規則的な構造をしているためAIに投げれば変換してくれます。(XMLの容量が大きすぎればコンテクストがパンクする可能性があるので、その場合は対策が必要)

    問題は、『どうなればいいのか』(仕様)を人間が指定してやらなければならない点です。なので、ここでいくつかアイデアを紹介します。

    1. HTML + 画像フォルダ

    ※以下のAIプロンプトはローカルへアクセス権のあるタイプ(Codex、Grok Build、Claude Codeなど)を想定

    AGENTS.md
    
    ## 依頼
    AIへ:NoteからエクスポートしたWXRアーカイブを以下の形式に変換するPythonスクリプトを作って:
    
    ## サンプルデータ
    C:\note\export.zip
    
    ## 変換後仕様
    index.html */目録形式、<a href="posts/記事1.html">投稿日YYYYMMDD 記事タイトル</a> /*
       \posts\
          記事1.html */hash値がファイルネーム/*
          記事2.html
          記事3.html
          記事4.html
          記事5.html
        \posts\assets\ */ 画像などはここへ配置し記事内から参照 /*
       \drafts\
          下書き1.html
          下書き2.html
          下書き3.html
        \drafts\assets\
    
    ## HTMLのスタイル
    
     */コンテンツはスクリーンリーディングに適したなビューエリア内に表示/*
    バナー画像
    投稿日時
    本文

    長所:オフライン閲覧向き
    短所:AIコラボ不向き

    2. MD + 画像フォルダ

    ※以下のAIプロンプトはローカルへアクセス権のあるタイプ(Codex、Grok Build、Claude Codeなど)を想定

    AGENTS.md
    
    ## 依頼
    AIへ:NoteからエクスポートしたWXRアーカイブを以下の形式に変換するPythonスクリプトを作って:
    
    ## サンプルデータ
    C:\note\export.zip
    
    ## 変換後仕様
    \posts\
       記事1.md */日付YYYYMMDD_記事名.md/*
       記事2.md
       記事3.md
       記事4.md
       記事5.md
    \drafts\
       下書き1.md
       下書き2.md
       下書き3.md
    \assets\
      \日付YYYYMMDD_記事名1\  */記事名1中のバナー+画像+埋め込みファイル/*
      \日付YYYYMMDD_記事名2\
      \日付YYYYMMDD_記事名3\
      \日付YYYYMMDD_記事名4\
      \日付YYYYMMDD_記事名5\
      \日付YYYYMMDD_下書き1\
      \日付YYYYMMDD_下書き2\
      \日付YYYYMMDD_下書き3\
    
    
    ## MDのスタイル
    
    YAML形式のフロントマターにタイトル、投稿日などを配置
    バナー画像リンク
    本文 */MDへ変換/*

    長所:AIとコラボレーション向き、Obsidianと親和性
    短所:メディアの連携が弱い(→Alt Textの重要性)

    3|サンプルコード:MD + 画像フォルダ変換

    使い方

    python convert-note-archive.py --archive アーカイブ名.zip

    環境

    • Python 3.9 以上(動作確認:3.12)

    • 外部ライブラリ:markdownify(HTML→MD変換用) pip install markdownify

    コード

    convert-note-archive.py:

    """Note export (WXR zip) -> Markdown + assets.
    Usage: python convert-note-archive.py --archive export.zip   (pip install markdownify)"""
    import argparse, json, re, zipfile
    from pathlib import Path, PurePosixPath
    from xml.etree import ElementTree as ET
    from markdownify import markdownify
    
    NS = {"c": "http://purl.org/rss/1.0/modules/content/", "wp": "http://wordpress.org/export/1.2/"}
    ap = argparse.ArgumentParser(); ap.add_argument("--archive", required=True)
    src = Path(ap.parse_args().archive)
    out = src.with_name(src.stem + "_md")
    zf = zipfile.ZipFile(src)
    xml = next(n for n in zf.namelist() if n.endswith(".xml"))
    assets = {PurePosixPath(n).name: n for n in zf.namelist() if "/assets/" in "/" + n and not n.endswith("/")}
    
    for item in ET.fromstring(zf.read(xml)).find("channel").findall("item"):
        title = item.findtext("title") or "untitled"
        date = (item.findtext("wp:post_date", namespaces=NS) or "")[:10].replace("-", "")
        kind = "posts" if item.findtext("wp:status", namespaces=NS) == "publish" else "drafts"
        stem = re.sub(r'[<>:"/\\|?*\s]+', "_", f"{date}_{title}")[:80]
        html = item.findtext("c:encoded", namespaces=NS) or ""
    
        def relink(m):  # copy a referenced image into assets/<stem>/ and point the link there
            name = PurePosixPath(m.group(1)).name
            if name not in assets:
                return m.group(0)
            (out / "assets" / stem).mkdir(parents=True, exist_ok=True)
            (out / "assets" / stem / name).write_bytes(zf.read(assets[name]))
            return f'src="../assets/{stem}/{name}"'
    
        html = re.sub(r'src="((?!https?:)[^"]*assets/[^"]+)"', relink, html)
        front = f"---\ntitle: {json.dumps(title, ensure_ascii=False)}\nurl: {item.findtext('link')}\ndate: {date}\n---\n"
        (out / kind).mkdir(parents=True, exist_ok=True)
        (out / kind / f"{stem}.md").write_text(f"{front}\n# {title}\n\n{markdownify(html)}", encoding="utf-8")
    print("done ->", out)

    出力結果例

    エクスポートフォルダーにYYYYMMDD_記事タイトル.mdのMDファイルが整然と並んでいる様子。

    4|ローカルへアクセス権のあるタイプのAIが無ければ

    本記事を当該AIへシェアし、相談の上勧めてください。シェアできるようにMDにしてここに置きます:

    5|スクレイピングとの比較

    スクレイピング(scraping)とは、機械的な方法で横断的にWebページを取得して保存することです。本稿で紹介するアーカイブ変換に比べ逐次性の面でメリットはあります。つまり、記事を一本投稿する度にアーカイブをエクスポートしてたら割が合わないですよね。スクレイピングなら少し工夫すれば差分だけ取得できます。

    問題はプラットフォーム側が特にAIの台頭以降、神経質になっていることです。たとえユーザーが自分の投稿のバックアップを取っているだけだとしても、Botだとか学習データ転売屋だとか勘違いされてブロックを食らう可能性があります。

    また、方法やツールを紹介したら広まり過ぎたり悪用されて対策されるというパターンもあります。よって、ここでは紹介はしません。

    一方でエクスポートは、公式の機能を使用してユーザーが自分のデータを取得するという真っ当なことをしているだけですから、勘違いされる心配がなく永続性があるのが強みじゃないかと思います。


    水銀の中から浮かび上がったような未来都市の遠景を描いたAIアートが純白のマットと額縁に入れられている。アート中の都市の中央部に特に高い高層ビル群が立ち並び、その間を金色に輝く高速道か鉄道のようなラインが優雅にうねっている。背景の空は淡い桃色のグラデーションで、ハイテクでありながら人間的な温かみを残した見たいを予感させる。
    "Horizon of Assembly", Eurybia Harlow-Vexley, 2026

    6|おわりに

    本手法はNoteに限らず、あらゆるコンテンツ生成プラットフォームに対して有効です。プレイブックは

    1. エクスポート手順の把握

    2. データ構造の大まかな理解

    3. 最終仕様(どうなれば自分にとって便利か)の確定

    4. AIに変換ツールを作らせる

    メリットは、ユーザーが逐一手動保存と整理をしなくてよくなることですね。一度完成させてしまえば

    まとめてエクスポート→機械的処理→整理整頓された出力

    これで終わりですから。

    因みに、AIのチャットログの整理にもこの手法は有効です。だってブラウザからいちいち保存するの、面倒でしょう?記事化は・・・後日気が向いたらするかもしれません 笑

    生成コンテンツの爆発的増大に伴って、こういったデータの整理整頓と管理術が今後ますます重要になってくるのではないかと思います。


    関連記事群:AI時代のパーソナル・データ・ソブリニティ

    あなたへのおすすめ