Drkcore

12 01 2010 Python Tweet

pythonでよそのサイトをRSS化する

先週末に酒のいわせさんに寄ったときに、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力を強めていきたいですな。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021