正規表現やってた成果がこれ.
# -*- coding: utf-8 -*-
"""
slashdotjp.py
スラッシュドットジャパンの記事リストおよび記事,コメントを読み込むモジュール
"""
import urllib,re
START_INDEX_LIST = "<!-- start template: ID 45, storysearch;search;default -->"
END_INDEX_LIST = "<!-- end template: ID 45, storysearch;search;default -->"
def get_index():
"""
記事リストを取得するモジュール
記事リストで取得できる記事のメタデータは次の通り
・(surl)url
・(sid)ストーリーid
・(year,month,day)投稿日
・(title)タイトル
・(comments)コメント数
・(formerbody)記事本文の前半部分
・(securl)セクションurl
・(secname)セクション
・(topics)トピック,トピックidのディクショナリのリスト
"""
# 最新のトップページ相当のインデックスを含む検索結果を取得し文字列に
s = urllib.urlopen('http://slashdot.jp/search.pl').read()
#s = file(r"C:\workspace\scanslashdotjp\trunk\searchresult.htm").read() #test用
s = unicode(s,'utf-8')
# \n\tを削る
s = s.replace('\n','')
s = s.replace('\t','')
# 前後のよけいな部分を削る
s = s.split(START_INDEX_LIST)[1]
s = s.split(END_INDEX_LIST)[0]
index = []
pos = 0
while True:
story = {}
index.append(story)
#url,ストーリーid,見出しをゲット
p = re.compile(unicode('<a href="(?P<surl>.*?=(?P<sid>(?P<year>\d+?)/(?P<month>\d+?)/(?P<day>\d+?)/.*?))">(?P<title>.*?)</a>','utf-8'))
m = p.search(s,pos)
story.update(m.groupdict())
pos = m.end()
#コメント数と本文の前半をゲット
p = re.compile(unicode('<br><font size="-1">.+?、(?P<comments>\d+?)個のコメント</font><br>(?P<formerbody>.+?)<br>','utf-8'))
m = p.search(s,pos)
story.update(m.groupdict())
pos = m.end()
#セクションurlとセクションの名前をゲット
p = re.compile(unicode('<font size="-1"><a href="(?P<securl>.+?)">(?P<secname>.+?)</a> >','utf-8'))
m = p.search(s,pos)
story.update(m.groupdict())
pos = m.end()
#トピック(複数)をゲット
p = re.compile(unicode('(?P<topics>.+?)<br> </font><p>','utf-8'))
m = p.search(s,pos)
story['topics'] = []
for sub_s in m.group('topics').split(', '):
t = {}
sub_p = re.compile(unicode('<a href="(?:.+?=)(?P<tid>\d+?)">(?P<topic>.+?)</a>','utf-8'))
sub_m = sub_p.search(sub_s)
t.update(sub_m.groupdict())
story['topics'].append(t)
pos = m.end()
if s[pos:pos+9] == '<A HREF="':
break
for story in index:
print story['sid'],story['title']
def get_story(url):
"""
単一の記事の本文とコメントを取得するモジュール
"""
#まだ実装してません
if __name__ == "__main__":
get_index()まだメソッドの引数のインターフェースをどうするか決めてません.
ディクショナリのリスト(rubyではハッシュの配列と呼んでるらし)にする仕様はhttp://slashdot.jp/code.shtmlのhswから拝借しましたがこういうときGPLはうつるんだろうか…