PythonのCGIスクリプトで診断メーカーの診断結果を複数同時に取得する

診断メーカーの複数の診断結果をテキストで返すCGIスクリプト。結果をHTMLから抽出するのにBeautifulSoupライブラリを使用した。

追記: 2010/11/02 HTML構造の変化に伴ってソースを変更しました。

#! /usr/bin/python2.6
# coding: utf-8

import cgi
import time
import urllib

from BeautifulSoup import BeautifulSoup

fs = cgi.FieldStorage()
url = 'http://shindanmaker.com/'

def resp(user, nums):
    rlst = []
    for n in nums:
        data = urllib.urlencode({'u': user})
        cont = urllib.urlopen(url + n, data).read()
        soup = BeautifulSoup(cont)
        # 2010/11/02
        #title  = soup.find('div', {'class':'shindantitle'}).find('h1').next.next
        title  = soup.find('div', {'class':'shindantitle2'}).find('a').contents[0]
        result = soup.find('div', {'class':'result'}).find('div').contents[0].strip()
        rlst.append('\t'.join([title, result]))
        time.sleep(2) # wait 2 seconds per request
    print '\n'.join(rlst)

def main():
    print 'Content-Type: text/plain; charset-utf-8'
    print ''
    try:
    	user = fs.getvalue('user')
    	nums = fs.getvalue('nums').split(',')
        resp(user, nums)
    except:
        print 'bad request'

main()

実行結果

ローカルにサーバを立ち上げて実行確認。
例: /cgi-bin/shindan.py?user=brainfs&nums=43421,43401,5105,18312 のレスポンス

パワ○ロったー(投手版)	brainfsは『球速 MAX161km/h、コントロールC、スタミナEで、決め球は変化量4のSFF』です。
表情ったー	brainfsは『(`・_ ̄)』です。
二次元女体化してやったー	brainfsを二次元女体化すると『服はワンピースで、つり目で茶髪のロングのツインテールで兎耳+兎尾でおっちょこちょいな感じのキャラ』のようだ
あなたを漢字75文字で表します。	≫brainfsを漢字75文字で表すと⇒胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸胸超無理