よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【folium】地図をブログに貼る際のタグ抽出プログラム

前回の投稿のつづき



前回は、JupyterNotebookとfoliumで作成した地図をブログに貼る方法を書きました。
前回
【folium】地図をブログに貼る方法 - よちよちpython

方法として、

  1. 地図を表示させたipynbファイルを一旦markdownファイルに変換し
  2. 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ファイルの中から、地図表示部分だけを抽出できました。



使い方


上のまとめたコードを

  1. JupyterNotebook上か、またはpyファイルにしてターミナルから実行すれば、
  2. カレントディレクトリ内のmdファイルからdivタグで囲まれた地図表示部分だけが抽出され、
  3. 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ファイルから地図部分を抽出抽出部分をクリップボードにコピー
が一発で済んだ。楽チン。



以上です。