読者です 読者をやめる 読者になる 読者になる

「作ればわかる! Google App Engine for Java プログラミング」本をPythonで書いてみる (8)

GoogleAppEngine Python

引き続き、「作ればわかる! Google App Engine for Java プログラミング」本にてPythonを修行中。


今回は今までのまとめのような感じ。
RSSをfeedparserで、XMLをlxmlで扱うやり方について学ぶことができた。

■実装時に困ったことと対応

gooのRSSを扱う方法

以下の記事によると、Pythonではいくつか方法があったが、使ったことがないfeedparserを使用してみることに。
めも帖 - PythonでRSSフィードなどを取得する


ダウンロード先がリンク切れとなっているので、Google Codeで同名のものがあったため、そちらを利用。
現時点での最新版は5.1.2、zipファイルをダウンロード・解凍。
すべてを配置すると非常に重いが、必要なのは、「/feedparser/feedparser.py」の一ファイルのみ。これを任意のフォルダへと配置するだけでOK。


使い方については、以下が詳しい。非常に簡単に扱える。
present - Python で RSS を取得する



Yahoo API の戻りXMLを扱う方法

chap7にて使用したlxmlが一番扱いやすそうなので、そちらを利用することに(端末にはインストール済)。
本では気づかなかったが、Yahoo APIの戻りXMLはxmlnsで名前空間指定していることから、それも考慮する必要がある(APIごとに異なる)。


実際に使ったコード例は、以下。text()の戻りがlistになるため、furigana[0]のように使う。

# ルビ振りサービスを呼び出す
response = urlfetch.fetch(
                          'http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid='
                          + api_config.Yahoo.APPLICATION_ID
                          + '&sentence='
                          + _encodeURIComponent(word)
                          )

# 取得した単語を1つずつ処理する
results = []
xml = etree.fromstring(response.content)
entries = xml.xpath('//xs:Result/xs:WordList/xs:Word', namespaces={'xs':'urn:yahoo:jp:jlp:FuriganaService'})

for entry in entries:
    # xpathはlistで戻ってくる
    furigana = entry.xpath('./xs:Furigana/text()', namespaces={'xs':'urn:yahoo:jp:jlp:FuriganaService'})
    if furigana[0] != '':
        # ふりがながあれば利用する
        results.append(furigana[0])

    else:
        # ふりがながない(英数字など)場合は、単語をそのまま利用する
        alphameric = entry.xpath('./xs:Word/xs:Surface/text()', namespaces={'xs':'urn:yahoo:jp:jlp:FuriganaService'})
        results.append(alphameric)

return ''.join(results)
webapp2でリクエストされたURLを知る方法

知りたい内容そのものが以下の質問にあった。「self.request.path」でOK。
人力検索はてな - webapp2 でユーザが要求して来たURLを取得する方法を教えてください。



オブジェクトのコピー

元のオブジェクトへ影響しない方法でのコピーを探したところ、ディープコピーがあるとのこと。
zerozerofourの日記 - pythonのcopyとdeepcopyの使い分け



JavaScriptCSSまわり

Python学習をメインにしているため、ソースコードをそのまま利用という手抜き・・・。



■ソース

GitHubのchap9へと追加。