先週末に酒のいわせさんに寄ったときに、yellow閉じちゃうらしいんですねー的ナ話をしたんですが、そういえば、旦那さんのほうのはyahooブログなんでRSS登録してあるけど、奥さんのほうのはrssがないから取りこぼしがあるかもん。これはまったくもっていかがなものかと自分用RSSを用意することにした。
BeautifulSoupとElementTreeで。
XML::RSSのpython版はないかなーと探してみたのだけど、テンプレート使ったりしてて丁度いいのが見当たらなかったのでElementTreeを選択した。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib2
import sys,re
from BeautifulSoup import BeautifulSoup
from datetime import datetime
import elementtree.ElementTree as ET
month = datetime.now().month
year = datetime.now().year
url = "http://sakeno-iwase.com/diary/diary02/diary.cgi?mode=read&y=%s&m=%s" % (year,month)
tp = re.compile(r'^<b>(.+)</b>$')
dp = re.compile(r'(\d+)月(\d+)日')
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
rss = ET.Element("rss",{"version":"2.0","xmlns:blogChannel":"http://backend.userland.com/blogChannelModule"})
channel = ET.SubElement(rss,"channel")
ET.SubElement(channel,"title").text = soup.head.title.contents[0]
ET.SubElement(channel,"link").text = "http://sakeno-iwase.com/diary/diary02/diary.cgi"
ET.SubElement(channel,"description").text = soup.head.title.contents[0]
for s in reversed(soup('td',{'class':'log'})):
item = ET.SubElement(channel,"item")
content = ''
for t in s.contents:
tm = tp.match(str(t))
dm = dp.search(str(t))
if tm:
ET.SubElement(item,"title").text = tm.group(1).decode('utf8')
elif dm:
cdate = datetime(year,int(dm.group(1)),int(dm.group(2)))
ET.SubElement(item,"pubDate").text = cdate.strftime("%a, %d %b %Y %H:%M:%S +0900")
else:
content = content + str(t)
ET.SubElement(item,"link").text = url
ET.SubElement(item,"guid",{'isPermaLink':'false'}).text = url
ET.SubElement(item,"description").text = content.decode('utf8')
rss = ET.tostring(rss)
f = open("/var/www/html/myrss/iwase.rss","w")
f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
f.write(rss)
f.close()
テーブルの中にタイトルと日付が入っているのでbeautifulsoupで適当に切り出してきて正規表現でマッチさせればよいんだけど、matchとsearchのありがちな問題に気づかず、マッチしねーよー、エンコードが悪いんかなー(怒)といらいらしっぱなしで、結局気づいたときには衰弱してたので直す気力がなかった。
ほんとはエントリごとに長いストリングで一回でタイトルと日付にマッチする正規表現にするだけなのに。
あと、ここ。
rss = ET.tostring(rss)
f = open("/var/www/html/myrss/iwase.rss","w")
f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
f.write(rss)
f.close()
先頭のXML宣言の入れ方がよく分からなかったので、rssをストリングで吐いといて先頭に宣言をつけるという、かなり駄目度が漂うやりかたですな。
ほかには、最初文字化けしまくっててdecodeしないといけないことに気づくのに結構時間がかかった(正規表現のおとぼけほどではないけど)こととか。
といった感じで、Python Developers Camp 2008 冬に向けてpython力を強めていきたいですな。