2008-09-02 22:42:40
ようやく使い方が少し解ったので、いつものようにKWICである。gglkwic.appspot.comで使えるようにした。コードはしたのような感じで。
import cgi
import wsgiref.handlers
import urllib
from google.appengine.ext import webapp
from google.appengine.api import urlfetch
from django.utils import simplejson
import re
from re import *
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write("""
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link type="text/css" rel="stylesheet" href="/css/gglkwic.css" />
<title>GoogleKWIC</title>
</head>
<body>
<h2>GoogleKWIC</h2>
<form action="/kwic" method="post">
<div><input type="text" name="word" ></div>
<div>言語:
<select name="lang">
<option value="ja" selected>日本語</option>
<option value="sl">スロヴェニア語</option>
<option value="sv">スウェーデン語</option>
<option value="tr">トルコ語</option>
</select>
結果数:
<select name="resnum">
<option value="2" selected>16</option>
<option value="4">32</option>
</select>
</div>
<div><input type="submit" value="検索"></div>
</form>
<p>調べたい語句を入力し、検索ボタンを押してください。<br />
検索は<a href='http://code.google.com/apis/ajaxsearch/'>
Google AJAX Search API</a>を利用します。</p>
</body>
</html>""")
def kwic(word,lang,resnum):
urlbase = 'http://ajax.googleapis.com/ajax/services/search/web?'
res = []
for i in range(int(resnum)):
query = {'v':'1.0','q':word.encode('utf-8'),'hl':lang,'rsz':'large',\
'start':str(i*8),'key':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}
url = urlbase + urllib.urlencode(query)
result = urlfetch.fetch(url)
if result.status_code == 200:
a = simplejson.loads(result.content)
results = a['responseData']['results']
for r in results:
title = r['titleNoFormatting']
content = r['content']
url = r['url']
res.append({'title':title,'content':content,'url':url})
return res
class Result(webapp.RequestHandler):
def post(self):
word = self.request.get('word')
lang = self.request.get('lang')
if lang == ('ja' or 'ko' or 'zh-TW' or 'zh-CN'):
width = 20
else:
width = 30
resnum = self.request.get('resnum')
results = kwic(word,lang,resnum)
table = "<table border='0'>"
for r_item in results:
content = r_item['content'].replace('<b>...</b>','')
kwords = re.findall('<b>.+?</b>',content)
parts = re.split('<b>.+?</b>',content)
j = 0
for kword in kwords:
trow = "<tr><td align='right'>"+parts[j][(len(parts[j]))-width:]+\
"</td><td align='center'>"+kword+"</td><td>"+parts[j+1][0:width]+\
"</td><td><a href='"+r_item['url']+"' target='_blank'>"+\
r_item['title'][0:10]+"</a></td></tr>"
j += 1
table += trow
table += "</table>"
self.response.out.write('<html xmlns="http://www.w3.org/1999/xhtml" \
xml:lang="' + lang + '">\n<head>\n<meta http-equiv="content-type" \
content="text/html; charset=UTF-8" />\n<link type="text/css" \
rel="stylesheet" href="/css/gglkwic.css" />\n<title>GoogleKWIC\
</title>\n</head>\n<body><h2>GoogleKWIC</h2>\n<p>Keyword = <strong>')
self.response.out.write(cgi.escape(word))
self.response.out.write(('</strong></p>\n'))
self.response.out.write(table)
self.response.out.write('</body></html>')
def main():
application = webapp.WSGIApplication([('/', MainPage),
('/kwic', Result)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
昨日も書いたように、一回の検索で返ってくる結果の上限はわずか8件。これを何回もまわせばいいのかと思ったが、5回以上回したらエラーが出てしまった。毎回1秒待ってみたけれども、同じだった。ばれているのか。最大32件じゃ頻度を集計して並べ替えたりする気にもならない。これでは全然面白くない。件数の多さではTechnoratiなのだが、どうも使いにくい。何れにせよ、もっと面白い使い方を探してみよう。