Index > 大規模ウェブサイトで有効期限のあるページを楽に管理する方法...python と BeautifulSoupを利用
Sat, October 25, 2008

{update:2009-01-26}

大規模ウェブサイトで有効期限のあるページを楽に管理する方法...python と BeautifulSoupを利用

某ホテルのウェブサイトを管理しているウェブマスターから

という相談を受けました。

それはまめにエクセル等に記録して管理すればいい話ではないか? とも思いましたが、 管理するページ数が多いと手間暇がかかるので、 スクリプトで一括チェックする方法を提案しました。 今回はそのアイデアとコードの覚え書きです。

基本的なアイデア

有効期限を記述する標準的な方法は?

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

参考

 Twitter
follow me on Twitter
 Categories