パーソナルツール
現在の場所: ホーム takalog forecastfox の日本語化フィルタを lxml に変更
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2010March »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
最近のコメント
Re:LEGO のブタがかわいすぎる件 (takanori 03-14 02:12)
Re:デジタルフォトフレームがほしい (mignon 03-11 12:36)
Re:LEGO のブタがかわいすぎる件 (Anonymous User 03-10 15:32)
Re: from __future__ import division (takanori 01-05 17:15)
from __future__ import division (しみずかわ 01-05 14:09)
最近のトラックバック
日本語にてPlone3.xを使用する便利なプロダクト (ブログ 08-31 13:52)
新しい写真集モジュール (ロバートのブログ 03-18 08:28)
新しい写真集モジュール (ロバートのブログ 03-18 08:28)
トランペットアンサンブルコンサート (人生日記 03-08 17:37)
PloneSlimboxに乗り換え♪ (pt001-blog 02-23 17:14)
カテゴリ
av (27)
books (32)
coreblog (49)
ds (22)
ferret (22)
google (35)
icecream (44)
lego (63)
mac (17)
misc (72)
moblog (277)
movie (32)
pc (43)
plone (297)
puzzle (40)
python (47)
server (63)
snowscoot (9)
software (126)
sports (32)
suidou (30)
winds (43)
 
文書操作

forecastfox の日本語化フィルタを lxml に変更

作成者 takanori投稿日 2009年06月29日 23時57分 最終変更日時 2009年06月29日 23時57分

コードはもうちょっと安定したらきれいにしますが、 firefox に天気予報を表示する拡張機能 forecastfox の 日本語対応版 で使っているフィルタを書き換えました。

このフィルタは、 http://www.accuweather.com/ から XML 形式で送られてくる天気予報のうち、地名と風向きを日本語に変換するものです。

以前のフィルタでは、天気や曜日の表記も日本語に変換していましたが、最新の forecastfox では拡張機能側でこのあたりの表記を日本語にするので、変換対象からはずしました。

また、いままで XML の変換は文字列のパターンマッチで置換していた(ダサ)のですが、そこを lxml を使ってパースして XPath で変換対象のノードを探して置換する形に変えました。

置換する部分のコードはざっくりこんな感じです。

実際に元データとなる 天気予報XML を見ると、なんとなく雰囲気がわかると思います。

# 風向き
WIND = {
    "N": "北",
    :
    }

# 都道府県
STATE = {
    "Japan": "日本",
    "Aichi Japan": "愛知県",
    :
    }

# 都市
CITY = {
    "Abashiri": "網走",
    "Abiko": "我孫子",
    :
    }

def handler(req):
    url = "http://forecastfox.accuweather.com/adcbin/forecastfox/weather_data.asp?" + req.args

    from lxml import etree
    tree = etree.parse(url)
    ns = {'t':'http://www.accuweather.com'}

    state = tree.xpath('//t:state', namespaces=ns)[0]
    state.text = unicode(STATE.get(state.text, state.text), 'utf-8')

    city = tree.xpath('//t:city', namespaces=ns)[0]
    city.text = unicode(CITY.get(city.text, city.text), 'utf-8')

    winds = tree.xpath('//t:winddirection', namespaces=ns)
    for wind in winds:
        wind.text = unicode(WIND.get(wind.text, wind.text), 'utf-8')
    wdata = etree.tostring(tree)

    req.set_content_length(len(wdata))
    req.write(wdata)

    return apache.OK

コードの前半部分で、英語を日本語に変換するための変換用辞書を作ります。

それから etree.parser(url) で XML をパースしたデータを作成します。

そのあとはノードを探しては ノード.text を変換用辞書を使用して書き換えることによって、英語から日本語に変換しています。

基本的に tree.xpath(xpath式) でノードを検索するんですが、ここで引数に namespaces=ns というのがついていると思います。 lxml でネームスペースを指定して検索する場合はこういう書き方をするそうです。

最初はこれがわからず、ぜんぜんノードがひっかからなくて「なんだろう~~」と悩んでました。

というわけで、とりあえず動いたようなのでこのまま動かしていきます。なにか動作に問題があったら連絡くださいませ。

カテゴリ
python python
software software
トラックバック用URL:
http://takanory.net/takalog/1121/tbping
コメントを追加

下のフォームに記入してコメントを追加できます。平文テキスト形式。

(必須)
(必須)
(必須)
(Required)
Enter the word

Powered by vine linux, python, zope, plone, coreblog