【folium】地図をブログに貼る際のタグ抽出プログラム
前回の投稿のつづき
前回は、JupyterNotebookとfoliumで作成した地図をブログに貼る方法を書きました。
前回
【folium】地図をブログに貼る方法 - よちよちpython
方法として、
- 地図を表示させたipynbファイルを一旦markdownファイルに変換し
- mdファイルの地図表示
divタグ
部分だけをブログ編集画面にコピペ
しかし、markdownファイルからタグをコピーするとき、その部分を探す手間が面倒です。
今回は、コピー部分を探す手間を省き、そこだけ抽出してくれるプログラムを作ります。
正規表現を使った文字列抽出の練習がてらです(*´・ω・`)b
実行環境
Androidスマホ
termux
Python3.8
JupyterNotebook
【参考】
Pythonで文字列を抽出(位置・文字数、正規表現) | note.nkmk.me
mdファイルの検索
markdownファイルを検索し、ファイル名を抜き出す。
ここでは作業ディレクトリ内のmdファイルを検索している。
import glob fname_lst = glob.glob("*.md") print(fname_lst)
['making_map.md', 'new.md']
2つ見つかった(仕込んでおいた)
1つ目のは地図作成プログラムを書いたipynbファイルを実行した上で、あらかじめmdファイルに変換しておいたもの。
2つ目のは適当に文字入力したもの。
mdファイルの読み込み
検索したmdファイルを読み込む。
検索ファイル名はリストで返される。
# mdファイルの読み込み for fname in fname_lst: with open(fname) as f: s = f.read() # 型 print(type(s))
<class 'str'>
<class 'str'>
変数s
にmdファイルの中身が文字列で格納された。
正規表現で地図のタグを部分抽出
上で読み込んだ文字列から、タグで囲まれた地図表示部分のみを正規表現で取り出す。
import re # 文字列からパターン文字列を抽出 map_match = re.findall('<div style="width.*</iframe></div></div>',s) print(map_match)
re.findall()
はリストで返される。
<div style="width
で始まり、</iframe></div></div>
で終わる部分を抜き出している。
コードをまとめる
上のコードをまとめておきます。
# ライブラリのインポート import glob import re # mdファイル検索 fname_lst = glob.glob("*.md") #print(fname_lst) # mdファイルの読み込み for fname in fname_lst: with open(fname) as f: s = f.read() # 文字列からパターン文字列を抽出 map_match_patterns = re.findall('<div style="width.*</iframe></div></div>',s) # 表示 for map_pattern in map_match_patterns: print(map_pattern) print("") print("="*25)
<div style="width:100%;"><div style="position:relative;width:100%;height:0;padding-bottom:60%;"><span style="color:#565656">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src="about:blank" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" data-html=PCFET0NUWVBFIGh0bWw+3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2h(中略)YWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWb246Z0OjA7fTwvc3R5bGU+iAgICAKPC9zY3JpcHQ+ onload="this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>
=========================
カレントディレクトリ内にあるmdファイルの中から、地図表示部分だけを抽出できました。
使い方
上のまとめたコードを
- JupyterNotebook上か、またはpyファイルにしてターミナルから実行すれば、
- カレントディレクトリ内のmdファイルから
divタグ
で囲まれた地図表示部分だけが抽出され、 - JupyterNotebookの「Out」か、ターミナル上に表示されます。
「抽出は楽にできたが、それをコピペするのも面倒だな…」
という場合は、JupyterNotebookを直接ブログに投稿するプログラムを書くと手間が省けるかも。
JupyterNotebookで地図作成と表示
↓
そのipynbファイルから地図部分だけ抜き出したmdファイルの自動作成
↓
mdファイルをブログに自動投稿
個人的には、ipynbに書いたブログを下書きに投稿できるプログラムだけを作り、下書き編集画面で地図作成のコード部分を削除している。
CLIアプリの問題点
地図作成をCLIアプリで簡単にできないのか?
ターミナル上でコマンドライン引数に地名や住所を与え、地図作成できれば楽だ。わざわざJupyter Notebookを開かずに済むではないか。
しかし、出来たhtmlファイルのタグ部分をコピペしてブログ投稿しようとしたが上手く表示されなかった。
ipynb→md
の場合とCLIアプリによるhtml
出力の場合とで地図表示部分の文字列が異なる。
上手く表示できないのは貼り付ける内容の違いなのか、編集モードの関係なのかは不明。
どうやればイケるのかな…
【追記】
抽出で出力されたものをクリップボードにコピーすると、より楽になる。
参考
[https://chayarokurokuro.hatenablog.com/entry/2019/09/24/193418:title]
たとえば、ターミナルでtermuxを使う場合、試しに↓のようなシェルスクリプトを作る。
jupyter nbconvert --to markdown *.ipynb python 抽出した部分を出力する.py |termux-clipboard-set
shファイルを実行するだけで
ipynbファイルをmdファイルに変換
→mdファイルから地図部分を抽出
→抽出部分をクリップボードにコピー
が一発で済んだ。楽チン。
以上です。