文字列⇒日付変換

文字列を日付型に変換する方法。

>>> #coding: utf-8
...
>>> import datetime
>>> import time
>>> dd = '2009年10月21日'
>>> st = time.strptime(dd, '%Y年%m月%d日')
>>> dt = datetime.date(st.tm_year, st.tm_mon, st.tm_mday)
>>> print dt
2009-10-21

で、これをHTML解析で応用してみる。
<table>タグの中のセル(<td>タグ)に、yyyy年mm月dd日、という書式で日付が入っているのを、BeautifulSoupで解析するというケースを考える。

soup = BeautifulSoup.BeautifulSoup(html)
tdSoup = soup.findAll("td")
if tdSoup:
    dd = tdSoup[0].string                   ・・・(1)
    st = time.strptime(dd, '%Y年%m月%d日')  ・・・(2)
    dt = datetime.date(st.tm_year, st.tm_mon, st.tm_mday)

みたいな感じでできるかなと思ったのだが、(2)のところでコケてしまう。エラーメッセージは以下。

ValueError: time data did not match format:  data=2009年10月21日  fmt=%Y年%m月%d日

ログられてる値を見ても、とくにおかしくはないんだけど、試行錯誤の結果、(1)の部分を次のように変更したら通った。

    dd = tdSoup[0].renderContents()         ・・・(1')

tdSoup[0]には、自身のタグ(今回の場合は<td></td>)も含まれた状態で格納されているので、(1)では、それの中身を取り出すために、.stringを使っているが、それで文字列化したつもりなのに、コケる。一方、renderContents()は、tdSoup[0]から、自身のタグを取り除いた結果を返してくれるものだそうであるが、これだとOK。


理屈がよくわからないのだが、とりあえずメモっておく。
参考:http://www.panopticon.jp/blog/2007/11/182337.html