1

ローカルで実行$ipython3 notebook --pylab=inlineし、pylab と python 3.3 を使用して小さな png フィギュアを含む単純なノートブックを保存しました。

ノートブックセルの内容:

from pylab import *

x = linspace(0, 5, 10)
y = x ** 2
figure()
plot(x, y, 'r')
xlabel('x')
ylabel('y')
title('title')
show()

セルを実行すると、インラインのpng図が表示されました。保存されたファイル (my_notebook.ipynb) には、データ URI として保存された .png があります。

{ ..., "png":"iVBO...ZUmwK\n...", ... }

コマンドを実行した後:

ipython3 nbconvert --to html my_notebook.html

my_notebook.html は、次のようなデータ uri として図を使用して生成されます。

<img src="data:image/png;base64,b'iVBO...ZUmwk\n..." >

最新の chrome または firefox では、file:///.../my_notebook.html をローカルで開いたときに画像データ uri がロード/表示されず、chrome コンソールが img タグの「リソースの読み込みに失敗しました」と報告します。

画像をロードして imshow() で表示しても同じ結果が得られました。図はノートにきれいに表示されます。それらが(まったく)表示されないのは、html への nbconvert の後です。

(画像データURIのエスケープされた改行に注意してください-データ文字列のすべてのエスケープされた改行を実際の改行に置き換えてみましたが、結果は変わりません)

ブラウザーでローカルに開かれた ipython ノートブック ("file:///.../my_notebook.html") の nbconverted-html バージョンに表示される png フィギュアを取得するにはどうすればよいですか?

(各図を保存し、変換された html を手動で変更して、ディスク上の保存された図を参照する必要はありません。)

編集: バージョン:

python 3.3.1
ipython==1.0.0
matplotlib==1.2.1
Pillow==2.1.0 (PIL)
4

1 に答える 1

0

最初にBeautifulSoup4をインストールします。

pip install BeautifulSoup4

次に、次の関数を使用して、生成された html ファイルをフリーズします。画像はimages、html ファイルと同じディレクトリの下のフォルダーに配置されます。

import os
import re
import base64
from bs4 import BeautifulSoup as BS
from uuid import uuid4


def dump(path, data):
    root = os.path.dirname(path)
    if not os.path.exists(root):
        os.makedirs(root)
    with open(path, 'wb') as f:
        f.write(data)
    # for windows
    return path.replace('\\', '/')


def freeze_html(path):
    '''pass in absolute path of your html'''
    root = os.path.dirname(path)
    with open(path, 'rb') as f:
        soup = BS(f.read())
    for img in soup.find_all('img'):
        m = re.search(r"data:image/png;base64,b'(.*)'", img['src'])
        if m:
            iname = uuid4()
            ipath = os.path.join(root, 'images', '%s.png' % iname)
            # remove '\n'
            s = m.group(1).replace(r'\n', '')
            img['src'] = os.path.relpath(
                dump(ipath, base64.b64decode(s.encode('ascii'))),
                root
            )
    with open(path, 'wb') as f:
        f.write(soup.encode('utf-8'))

さらにtexまたはpdfに変換する必要がない場合は、文字列(\n削除)をimg['src']data:image/png;base64,プレフィックス付きで)書き戻すことができます:

import re
from bs4 import BeautifulSoup as BS


def freeze_html(path):
    '''pass in absolute path of your html'''
    with open(path, 'rb') as f:
        soup = BS(f.read())
    for img in soup.find_all('img'):
        m = re.search(r"data:image/png;base64,b'(.*)'", img['src'])
        if m:
            # remove '\n'
            s = m.group(1).replace(r'\n', '')
            img['src'] = 'data:image/png;base64,' + s
    with open(path, 'wb') as f:
        f.write(soup.encode('utf-8'))

xelatex に適しているため、png を別のファイルに保存することを好みます。

于 2013-09-12T02:12:59.300 に答える