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なのだが、どうも使いにくい。何れにせよ、もっと面白い使い方を探してみよう。