Sphinx(ablog)の後処理をする
Sphinx(ablog)で出力したHTMLのドキュメントファイルに対して、bashとPythonを使って後処理をしました。具体的には、タグの属性の書き換えです。
目次
どうしてこんなことをするのか
Twitterカードを表示するためにMETAタグの中にTwitter社指定のタグを書かなければならないのですが、その指定のタグの書式にコロンが使われています。
reStructuredTextでMETAタグを出力させる場合はmetaディレクティブを使用するのですが、name属性にコロンの指定ができません。(ご存じの方がいらっしゃいましたら、教えてください。)
仕方がないので、Twitterカード用のタグのところには代替のテキストを入れておいて、HTML出力後にタグを書き換えることにします。
どういう手順で実行するのか
PythonのBeautifulSoupというモジュールを使って、タグを書き換えることにしました。
単純に正規表現による置換だけで書き換えても良いのですが、せっかくの構造化テキスト(HTMLのこと)なのでそれっぽく書き換えたいと思います。
Pythonで1つのファイルの置換処理をするスクリプトを作って、bashにそのスクリプトを連続実行させます。
作ったスクリプト
まずは、Pythonのスクリプトです。 ファイル名は、mypostprocess.pyです。
from bs4 import BeautifulSoup
import re
import sys
# 引数の読み込み
fn = sys.argv[1]
# ファイル読み込み
with open(fn, mode='rt', encoding='utf-8') as fi:
source_text = fi.read()
soup = BeautifulSoup(source_text, 'html.parser')
# 置換の要否判定
if len(soup.head.find_all('meta', attrs={'name': 'twitter_card'})) < 1:
print('Checked. :' + fn)
sys.exit()
# 置換実行
soup.head.find('meta', attrs={'name': 'twitter_card'})['name'] = 'twitter:card'
soup.head.find('meta', attrs={'name': 'twitter_title'})['name'] = 'twitter:title'
soup.head.find('meta', attrs={'name': 'twitter_description'})['name'] = 'twitter:description'
image_link = soup.head.find('meta', attrs={'name': 'twitter_image'})['content']
correct_link = re.sub(r'^../../', 'https://water2litter.net/rum/', image_link)
soup.head.find('meta', attrs={'name': 'twitter_image'})['content'] = correct_link
soup.head.find('meta', attrs={'name': 'twitter_image'})['name'] = 'twitter:image'
# ファイル書き込み
with open(fn, mode='wt', encoding='utf-8') as fo:
fo.write(str(soup))
print('Modified. :' + fn)
まあ、コメントに書いてあるとおりの処理をしてます。
BeautifulSoupのオブジェクトは、文字列に変換しないと出力できないので注意です。
続いて、シェルスクリプトの方です。
#!/bin/bash
set -Ceu
rm -v ./_website/all_post/index.html
ablog build
for file in `find ./_website/ -name '*.html'`; do
python mypostprocess.py $file
done
後処理を実行しているのは、for文以降の箇所です。
findでhtmlファイルを探して、それをpythonに処理させています。 いちいちPhthonを呼び出しているからか、MacBook Air 2017ではちょっと時間がかかります。まあ、ちょっと待ってれば終わるので気にすることはありません。
公開日
広告
作ってみたカテゴリの投稿
- PythonでFizzBuzz問題をやってみた
- PythonでPDFファイルのサムネイル画像を作る
- Pythonでオブジェクトを選択してクロップするツールを作ってみた
- Pythonでデータロガーのログから瞬断を抽出してみる
- Pythonで写真の中の線を抽出してみた
- Pythonで動画から静止部分を抜き出してみた
- Pythonで測定データのピーク値を検出してみる
- Pythonで複数のCSVデータを1つのファイルにまとめてみた
- PythonとExcelでフォルダの使用量を調べてみた
- Sphinx(ablog)の後処理をする
- WordPressのブログを静的サイトに書き換えてみました
- シェルスクリプトでSphinxのビルドの前処理をする
- 数式を中置記法から後置記法(逆ポーランド記法)に変換してみた