{update:2009-01-26}
大規模ウェブサイトで有効期限のあるページを楽に管理する方法...python と BeautifulSoupを利用
某ホテルのウェブサイトを管理しているウェブマスターから
- キャンペーンページなどで有効期限の過ぎたページを少ない手間で管理するにはどうしたらいいか?
という相談を受けました。
それはまめにエクセル等に記録して管理すればいい話ではないか? とも思いましたが、 管理するページ数が多いと手間暇がかかるので、 スクリプトで一括チェックする方法を提案しました。 今回はそのアイデアとコードの覚え書きです。
基本的なアイデア
- 各ウェブページ(htmlのヘッダ部分)に有効期限を示す日付情報を埋め込んでおく
- 埋め込んだ日付情報を読み取って有効期限を過ぎていれば削除するスクリプトを用意する
有効期限を記述する標準的な方法は?
HTMLでそのページの有効期限を記述する標準的な方法はないか調べました。 どうやらメタタグに以下のように書くことで、 そのページの有効期限を示すことができるようです。
<meta name="expires" content="2008-12-26">
日付の表記方法
content属性の値となる日付表現がどのように書くのが正しいのかまでは まだ調べていないのですが、とりあえず、ここでは、上記のように yyyy-mm-dd 形式で表現することとします。
該当メタタグを読み取る chkexpiry.py
HTMLに有効期限が記述されていれば、あとは、それを読み取って
今日時点と比較して古いかどうか、調べればOKです。
pythonには、
HTMLをパースして、該当メタタグ部分の情報を抜き出すのに
便利なBeautifulSoup
というツールがあります。
これ(BeautifulSoup.py)をダウンロードして、以下のchkexpiry.py と同じ
ディレクトリに保存しておきます。
chkexpiry.py ... 該当メタタグを読み有効期限切れをチェックするコード
import sys
import time
from datetime import datetime, timedelta
from BeautifulSoup import BeautifulSoup
def isOutofExpiry(expiries):
if expires!=None:
st=time.strptime(expires,'%Y-%m-%d')
dt=datetime(st.tm_year, st.tm_mon, st.tm_mday)
now= datetime.now()
yesterday = now-timedelta(1)
#if dt < now:
if dt < yesterday:
return True
#print "old"
return False
def getExpiresDate(targetfile):
c=open(targetfile,'r')
soup=BeautifulSoup(c.read())
metas=soup('meta')
expires=None
for meta in metas:
try:
if meta['name']=='expires':
#print meta['name']
expires=meta['content']
except :
pass
return expires
targetfile=sys.argv[1]
expires=getExpiresDate(targetfile)
#print expires
if isOutofExpiry(expires):
print targetfile + " is out of date."
※python2.3以上で動きます。
以下のように使います。 $ python chkexpiry.py index.html
※もちろん、index.htmlには、以下のようにメタタグを記述しておきます。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>test</title> <meta name="expires" content="2008-12-26"> </head>HTMLの文字エンコーディングがUTF-8以外の場合
UTF-8に変換後、chkexpiry.py へ渡す必要があります。 これは、Beautifulsoup が UTF-8のみ受け付けるためです。
たとえば、nkfを使って前処理してから chkexpiry.py へ渡します。 $ nkf -w foo.html > fooutf8.html $ python chkexpiry.py fooutf8.html
全体を組み立てる
あとは、以下のようなシェルスクリプトで HTMLファイルを全部リストアップして、一つ一つ chkexpiry.py を 使って有効期限切れがないかチェックすればOKです。
listup.sh
#!/bin/sh
htmlfiles=`find ./ -name "*.html"`
for html in $htmlfiles
do
python chkexpiry.py $html
done
参考