Jupyter Notebookの内容を画像も含めてそのままQiitaへ投稿する


JupyterのMarkdownをQiitaへ投稿

Jupyter Notebookの内容を「File → Export」機能により「Markdown」形式でエクスポートすると、得られる.mdファイルの内容をそのままQiitaに貼り付けて投稿できるので、とても便利です。

ただ、Notebookで描画したグラフなどの画像がある場合は、画像へのリンクアドレスがQiitaへ投稿すると違ってくるので、書き換える必要があります。

画像も含めてそのままQiitaへ投稿する

そこで、画像をQiitaへ投稿・画像のリンクアドレスを書き換え、を行うスクリプトを試作してみます。

投稿の仕方

Jupyter Notebookの内容を「File → Export」から「Markdown」形式でエクスポート。

 ↓
Notebookに画像がある場合は、.zipファイルが得られます。この中身の、.mdファイル①と、その他の画像ファイル(.png)全て②、を以降で使います。
 ↓
後段に掲載の「conv_jupyter_md_pic_to_qiita.py」ファイルと同じフォルダに、.zipの中の.mdファイル①を配置。
 ↓
Qiitaで新規投稿→記事を作成し、新しい編集ページ枠の上へ、.zipの中の画像ファイル(.png)全て②をドラッグアンドドロップ。

 ↓
画像がアップロードされ、Markdownのリンク文字列が生成されるので、これを全て選択して切り取り、.txtファイル③を新規に用意して貼り付けて保存。
 ↓
「conv_jupyter_md_pic_to_qiita.py」ファイルと同じフォルダに、.txtファイル③を配置。
 ↓
スクリプト「conv_jupyter_md_pic_to_qiita.py」を実行。
 ↓
.mdファイル①のファイル名に.convが付いた.mdファイル④が新しく作成され、この中には、画像のリンクアドレスがQiitaへ投稿した画像のものに変換されたMarkdownが出力されています。
 ↓
生成された.mdファイル④の内容をすべてコピーして、Qiitaの編集ページへ貼り付けます。Qiitaのプレビューに画像も合わせて表示されます。

画像のリンクアドレスを書き換えるスクリプト.pyコード

conv_jupyter_md_pic_to_qiita.py
# -*- coding: utf-8 -*-

# Jupyter Notebookでダウンロード(エクスポート)したMarkdown(.zipファイル)を
# Qiitaで公開するために、画像パスを置換。

# Markdown(.zipファイル)の中にある画像ファイルは、Qiitaの編集ページで
# すべてドラッグアンドドロップ、その時に出てくる画像表示のMarkdownを
# テキストファイルに保存して、このスクリプトで置換。

import pathlib, re

# sec: main

def main(): # 実行切替用
    run__main1()

def run__main1():

    # sec: path

    path_md = None
    for path_md in pathlib.Path(".").glob("*.md"): break

    print("load:", path_md)
    if path_md is None: # if: 該当なし
        return

    path_qi = None
    for path_qi in pathlib.Path(".").glob("*.txt"): break

    print("load:", path_qi)
    if path_qi is None: # if: 該当なし
        return

    # sec: load Qiita-pic-list

    with path_qi.open(mode='r', encoding="UTF8") as file:
        lines_qi = file.readlines()

    # sec: make list

    re_pic = re.compile(r"!\[([^\]]+)\]\(([^)]+)\)") #" Qiitaコード色付けが不調の為
    qi_pic_list = []
    for line in lines_qi:

        if len(line) <= 0:
            continue

        matched = re_pic.match(line)
        if matched is None: # if: 画像のMarkdownと不一致
            print("エラー: 画像のMarkdownと不一致", line)
            return

        qi_pic_list.append( (matched.group(1), matched.group(2)) )

    print("conv:", len(lines_qi))

    re_pic = None
    lines_qi = None

    # sec: conv

    text_md = path_md.read_text(encoding="UTF8")
    for name, addr in qi_pic_list:
        text_md = text_md.replace("![png](%s)" % name, "![%s](%s)" % (name, addr))

    # sec: output

    path_md_out = path_md.with_name("%s.conv%s" % (path_md.stem, path_md.suffix))
    path_md_out.write_text(text_md, encoding="UTF8")

    print("output:", path_md_out)

# sec: entry

if __name__ == "__main__": main()

コードの概要

作成中。