« 巫女さん細腕繁盛記えくすとら:香奈恵ちゃんFight!!:サラはウタがヘタ | トップページ | ubicast で投稿してみたテスト »

2004年12月15日

ココログの RSS から html を作る

# ココログやココフラッシュ形式の RSS を html にして出力する Python プログラム
# utf-8 で RSS1.0 なら他所の RSS でもそれなりに動くと思う
# パブリックドメイン扱いにしますので適当にどうぞ
import xml.sax
from xml.sax.saxutils import escape
from urllib import urlopen
RSS_LIST = "rsslist.csv" # "出力するhtmlファイル名,RSSのURL" 形式の csvファイル
# 以下のような形式の CSV ファイルを用意する。
u"""
updates.htm,http://www.cocolog-nifty.com/updates.rdf
game.htm,http://www.cocolog-nifty.com/cocoflash/rss/ge^mu.rdf
tuchinoko.htm,http://tuchinoko.moe-nifty.com/oboegaki/index.rdf
"""
class RssItems(object):
    def __init__(self):
        self.data = {u"title":"",
                     u"link":"",
                     u"description":"",
                     u"dc:date":"",
                     u"dc:language":"",
                     u"dc:creator":"",
                     u"dc:publisher":None,
                     u"dc:subject":[],
                     u"content:encoded":None}
        self.text = []
    def startElement(self, tag):
        self.text = []
    def characters(self, content):
        self.text.append(content)
    def endElement(self, tag):
        if tag in (u"dc:date",):
            self.data[tag] = self.text[0][:len(
                u"yyyy-mm-ddThh:mm:ss")].replace(u"T", u" ")
        elif tag in (u"title", u"link", u"description", u"dc:language",
                     u"dc:creator", u"content:encoded", u"dc:publisher"):
            self.data[tag] = u"".join(self.text)
class Channel(RssItems):
    def endElement(self, tag):
        if tag in (u"description",): # JavaScript やら張っている所があるので
            self.data[tag] = escape(u"".join(self.text))
        else:
            RssItems.endElement(self, tag)
class Item(RssItems):
    def endElement(self, tag):
        if tag in (u"dc:subject",): # 「分類」は複数ある場合も
            self.data[tag].append("".join(self.text))
        else:
            RssItems.endElement(self, tag)
class Handler(xml.sax.ContentHandler):
    def __init__(self, data):
        xml.sax.ContentHandler.__init__(self)
        self.data = data
        self.dummy = RssItems()
    def startDocument(self):
        self.item = self.dummy
    def startElement(self, tag, attr):
        if tag == u"channel":
            self.item = Channel()
        elif tag == u"item":
            self.item = Item()
        else:
            self.item.startElement(tag)
    def endElement(self, tag):
        if tag in (u"channel", u"item"):
            self.data.append((tag, self.item.data))
            self.item = self.dummy
        else:
            self.item.endElement(tag)
    def characters(self, content):
        self.item.characters(content)
def xhtml_out(data, rss = None):
    channel = data[0][1]
    html = [u"""<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>%(title)s</title>
</head>
<body>
""" % channel]
    if rss is not None:
        html.append(u"""<p><a href="%s">RSS</a></p>""" % (rss,))
    html.append(u"""
<h1><a href="%(link)s">%(title)s</a></h1>
<p>%(description)s</p>
<table>
<tr><th>最終更新</th><td>%(dc:date)s</td></tr>
</table>
""" % channel)
    contents = []
    items = []
    for n in range(1,len(data)):
        i = data[n][1]
        i[u"no"] = u"n%d" % (n,)
        if not i[u"title"].strip():
            i[u"title"] = u"(no title)"
        if i[u"dc:publisher"] is not None:
            i[u"title"] = (i[u"title"]+u"<small><em> "+
                           i[u"dc:publisher"]+u"</em></small>")
        i[u"dc:subject"] = u", ".join(i[u"dc:subject"])
        contents.append(u"""
<li><small>%(dc:date)s </small><a href="#%(no)s">%(title)s</a></li>\n""" % i)
        if i[u"content:encoded"] is None:
            i[u"content:encoded"] = u"<p>%(description)s</p>" % i
        items.append(u"""<h2 id="%(no)s"><a href="%(link)s">%(title)s</a></h2>
<table>
<tr>
<th>日時</th><td>%(dc:date)s</td>
<th>著者</th><td>%(dc:creator)s</td>
<th>分類</th><td>%(dc:subject)s</td>
</tr>
</table>
<div class="content">
%(content:encoded)s
</div>
<hr />
""" % i)
    html.append(u"<ol>\n")
    html += contents
    html.append(u"</ol><hr />\n")
    html += items
    html.append(u"</body>\n</html>")
    return "".join(html)
def make_html(html, url):
    data = []
    p = xml.sax.make_parser()
    p.setContentHandler(Handler(data))
    f = urlopen(url)
    p.feed(f.read())
    f.close()
    p.close()
    f = file(html, "w")
    f.write(xhtml_out(data, url).encode("utf-8"))
    f.close()
for i in file(RSS_LIST):
    i = i.strip()
    if i:
        html, url = i.split(u",")
        print html,
        make_html(html.strip(), url.strip())
        print u"ok"
print "<< end >>"

« 巫女さん細腕繁盛記えくすとら:香奈恵ちゃんFight!!:サラはウタがヘタ | トップページ | ubicast で投稿してみたテスト »

ウェブログ・ココログ関連」カテゴリの記事

Python」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: ココログの RSS から html を作る:

« 巫女さん細腕繁盛記えくすとら:香奈恵ちゃんFight!!:サラはウタがヘタ | トップページ | ubicast で投稿してみたテスト »

他のアカウント

ブログ妖精

  • ココロ

Affiliate

無料ブログはココログ