2010/04/24

メモ: Google App Engine 開発に Python 対話モードを用いる

こんにちは。

Google App Engine でプログラム作る時に、これまではインタープリタとしての Python を活用していませんでした。これでは効率悪いなー、と言ってもまあそれ以上に毎回思い出したり調べたりするのに時間がかかっていたのですが。

今回 Python を対話モードで使ってみました。あまり試行錯誤は書かず、うまくいく方法のメモだけ残したいと思います。

必要なモジュールをインポートする


ここは対話モードでなくても行っているのでわざわざ書くこともないけれども。
>>> date = datetime.datetime.now()
Traceback (most recent call last):
File "", line 1, in
NameError: name 'datetime' is not defined

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2010, 4, 24, 11, 13, 23, 621482)

Googleのモジュールはこれでは見つからないので、利用可能にしなければならない。

モジュールのありかをPYTHONPATHで指定する


参考: A-LIAISON BLOG Mac OS X LeopardでPYTHONPATHとPYTHONSTARTUPを設定してみました

import する場所を PYTHONPATH 環境変数で教える。ターミナルで、Pythonに入る前に行う。
export PYTHONPATH=${PYTHONPATH}:
/usr/local/google_appengine:/usr/local/google_appengine/lib/antlr3:
/usr/local/google_appengine/lib/django:/usr/local/google_appengine/lib/webob:
/usr/local/google_appengine/lib/yaml/lib
(改行なし)

ところが今回行うAPI結果取得ではこれでは十分でなかった。

APIを用いた検索結果取得


APIを用いた検索結果取得
>>> import urllib
>>> from google.appengine.api import urlfetch
>>> url = "http://search.twitter.com/search.atom?q=" + urllib.quote(keyword) + "&locale=ja&rpp=30"
>>> urlfetch(url)
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/google_appengine/google/appengine/api/urlfetch.py", line 238, in fetch
rpc = create_rpc(deadline=deadline)
File "/usr/local/google_appengine/google/appengine/api/urlfetch.py", line 200, in create_rpc
return apiproxy_stub_map.UserRPC('urlfetch', deadline, callback)
File "/usr/local/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 345, in __init__
self.__rpc = CreateRPC(service)
File "/usr/local/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 54, in CreateRPC
assert stub, 'No api proxy found for service "%s"' % service
AssertionError: No api proxy found for service "urlfetch"

解決策は下記に書いてありました。

メモなのですよGoogle App Engine の urlfetch を試してみた
>>> from google.appengine.api import apiproxy_stub_map
>>> from google.appengine.api import urlfetch_stub
>>> apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
>>> apiproxy_stub_map.apiproxy.RegisterStub('urlfetch', urlfetch_stub.URLFetchServiceStub())
>>> urlfetch.fetch(url)

後はDOMの操作。

DOMの操作


まずは検索結果をパースして要素を得る。
>>> import xml.dom.minidom
>>> result = urlfetch.fetch(url)
>>> top = xml.dom.minidom.parseString(result.content)
>>> entries = top.getElementsByTagName('entry')
>>> entry = entries[0]
>>> name = entry.getElementsByTagName('name')[0].firstChild.data

今回知りたかったことは、属性の取得方法。

参考: Dive Into Python 9.6. Accessing element attributes
>>> link = entry.getElementsByTagName('link')[0]
>>> attributes = link.attributes
>>> attributes

>>> attributes.keys()
[u'href', u'type', u'rel']
>>> link=attributes["href"]
>>> link.name
u'href'
>>> link.value
u'http://twitter.com/username/statuses/nnnnnn'
以上、できました。
コメントを投稿