2008-08-28 21:37:12
Yahoo!検索Webサービスから返ってくるXMLはElementTreeで受けられるようになったのだが、Amazon A2S (ECS 4.0) がどうしても処理できない。minidomも試したのだけど、どうにもならない。何週間も情報を探し求めたのだが、答えに辿り着かない。どうして、こんなことを探さなければならないんだ。他の方法を探そうと心に決めた。もうElementTreeもminidomも使ってやらない。XMLだからってちょっと生意気じゃないか。普通の文字列として処理してやりゃあいいじゃないか。ということに気がついて、正規表現で切り刻んでやった。今頃謝っても許してやらないからそのつもりでいるように(謝られたりはしていないが)。
#!/usr/bin/env python # -*- coding: utf-8 -*- #
import cgi import wsgiref.handlers
from google.appengine.ext import webapp from google.appengine.api import urlfetch import urllib import re from re import *
class MainPage(webapp.RequestHandler): def get(self): self.response.out.write(""" <html> <body> <h2>amazon-search</h2> <form action="/result" method="post"> <div><input type="text" name="word" ></div> <div><input type="submit" value="Submit"></div> </form> </body> </html>""")
def amazon(word): re_asin = re.compile('<ASIN>.+?</ASIN>') re_title = re.compile('<Title>.+?</Title>') tags = re.compile('<.+?>') query = {'Service':'AWSECommerceService','AWSAccessKeyId':'xxxxxxxxxxx',\\ 'Operation':'ItemSearch','SearchIndex':'Books','Sort':'-publication_date',\\ 'Keywords':word.encode('utf-8'),'ResponseGroup':'Medium'} url = 'http://webservices.amazon.co.jp/onca/xml?' + urllib.urlencode(query) xml = urlfetch.fetch(url).content items = findall('<Item>.+?</Item>',xml) res = [] for item in items: ASIN = tags.sub('',re_asin.search(item).group(0)) title = tags.sub('',re_title.search(item).group(0)).\\ decode('utf-8') res.append(ASIN+' : '+title) return res
class Result(webapp.RequestHandler): def post(self): word = self.request.get('word') res = amazon(word) results = '<br />'.join(res);
self.response.out.write('<html><body><h2>\\ Amazon Search</h2>Keyword=') self.response.out.write(cgi.escape(word)) self.response.out.write('<br />\n <pre>') self.response.out.write(results) self.response.out.write('</pre></body></html>')
def main(): application = webapp.WSGIApplication([('/', MainPage), ('/result', Result)], debug=True) wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__': main()
まず、urlfetch.fetch(url).contenで受け取ったXMLを<Item>〜</Item>で分割する。結果はリストに収納されるので、Itemごとにやはり正規表現で<Title>とか<ISBN>とか抽出していけばいい。上では、題名とASINを抜き出している。日本語の文字列はdecode('utf-8')としてやらないと読める文字にならない。試しに「食虫植物」で検索してみると下の画像のようになった。
なんだ、簡単じゃないか。XMLだからって偉そうに人を馬鹿にしやがって。さて、これで何を作るかはまだ考えていない。