カテゴリー : Python

[Python] UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3

Python + Google App Engine の勉強を下記サイトに沿ってしていたところ、文字コードでつまずいたのでメモ。

【libro】 PythonによるGoogle App Engine(GAE)プログラミング入門

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#
import os
from google.appengine.ext import webapp, db
from google.appengine.ext.webapp import util, template
 
class MainHandler(webapp.RequestHandler):
	def get(self):
		params = {'message':'これは、テンプレートで出力したWebページです。'}
		fpath = os.path.join(os.path.dirname(__file__),'views','index.html')
		html = template.render(fpath, params)
		self.response.headers['Content-Type'] = 'text/html'
		self.response.out.write(html)
 
	def post(self):
		text1 = self.request.get('text1')
		params = {'message':'こんにちは、' + text1 + 'さん!'}
		fpath = os.path.join(os.path.dirname(__file__),'views','index.html')
		html = template.render(fpath, params)
		self.response.headers['Content-Type'] = 'text/html'
		self.response.out.write(html)
 
def main():
	application = webapp.WSGIApplication([('/', MainHandler)],
                                         debug=True)
	util.run_wsgi_app(application)
 
if __name__ == '__main__':
	main()

postで渡された日本語文字を表示させようとしたら下記のようなエラーが表示されました。

Traceback (most recent call last):
File “/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py”, line 636, in __call__
handler.post(*groups)
File “/Users/bakorer_mac/Dropbox/Program/GAE/bakorer-labo/main.py”, line 20, in post
params = {‘message’:’こんにちは、’ + text1 + ‘さん!’}
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3 in position 0: ordinal not in range(128)

文字コードでつまずいたらここを読んで復習するようにしています。

・参考:PythonのUnicodeEncodeErrorを知る – HDEラボ

17行目を以下のように修正すればエラーが消えました。

		text1 = self.request.get('text1').encode('utf-8')

以上です。

CORESERVER に Python 2.7.1 をインストールする方法

CORESERVER(コアサーバー)に Python 2.7.1 をインストールしました。

Index of /ftp/python

インストール方法は、参考になるサイトがたくさんあるので割愛します。

■ 参考サイト

[CORESERVER][Python]CORESERVERでPython2.7.1を動かした – Weblog – yosida95's site

ワタシのート: CORESERVER(CORE-MINI)にPython2.6.6を入れた

[言語][Python][メモ]CORESERVER に Python 2.5 をインストール | 漫ろで行こう

CoreserverさんのローカルフォルダにPython2.5.5をインストールする | Oh!Happy.ORG Blog

インストール後、「 python -V 」でバージョン確認しても、python2.4.3 のままで反映されていませんでした。

結局、bash を起動していなかったのが原因みたいでした。

・参考:Python のインストール(Xrea編) – tomoyan.net

以上です。

[Python] The Zen of Python

Pythonの本質的な真実を良く表現している「The Zen of Python」が素敵だったのでシェア。

The Zen of Python
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

PEP 20 — The Zen of Python はてなブックマーク - PEP 20 -- The Zen of Python

The Zen of Python

きたないのよりきれいな方がいい

ごちゃごちゃ難しいのより、白黒はっきりしてるのがいい

めんどうなのよりかんたんな方がいい

けど、訳分かんなくなるくらいならめんどうな方がまし

ネストさせなくていいならしない方がいい

たくさん詰め込んだのよりスカスカな方がいい

読みやすさがたいせつなのよ

特別なこともあるけど掟破りってほどじゃない

実用性を求めてくと、ちょっとはずれちゃうこともあるけどね

わざとそうしてるんじゃない限り

エラーをだまって通すようなことがあっちゃいけません

あいまいなことをてきとーに処理しちゃいけません

間違えようのないやり方がひとつだけあるのがいいね

オランダ人以外には、ちょっと分かりにくかったりしてもね

やらないよりは今やるべき

けど今「すぐ」やるならやんない方がいいこともある

作るものをうまく説明できないようならそれはボツ

うまく説明できたらたぶんそれがグッド

ぶらぼーなアイディア名前空間、やっぱこれですね

The Zen of Python はてなブックマーク - The Zen of Python

[Python] ウェブサイトから必要なデータだけ取得する「スクレイピング」をBeautifulSoupでやる方法

Pythonでウェブページから必要なデータだけ取得する方法を調べたのでメモ。

この”ウェブサイトから必要なデータだけ取得する”ことを「スクレイピング」というらしいです。

「スクレイピング」 = ウェブサイトのデータを必要な部分だけ抽出して利用すること

を頭に入れておけば、あとは「Python スクレイピング」で検索すればたくさん参考になる記事が出てきます。

僕も早速、下記のサイトを参考にしてやってみました。

Google app engineでBeautifulsoupを使う – YutaKikuchiのTechBlog

Phactory : Python: BeautifulSoupで、HTML/XMLをらくらくパージング

BeautifulSoupというPythonのライブラリを使えば簡単にできるみたいですね。すごい。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import urllib2
from BeautifulSoup import BeautifulSoup
 
url = "http://www.yahoo.co.jp"
htmlfp = urllib2.urlopen(url)
html = htmlfp.read().decode("utf-8", "replace")
htmlfp.close()
 
soup = BeautifulSoup(html)
for link in soup.findAll("a"):
	print link

このプログラムでは、Yahoo! JAPAN(http://www.yahoo.co.jp/)から
<a href="http://www.hogehoge.com/">〜〜〜</a>などのリンクだけを取得してprintしています。

実行結果は以下の通りです。(一部抜粋)

<a href="r/mht"><nobr>ヘルプ</nobr></a>
<a href="s/92091">天気、交通情報ほか、連休お役立ち情報</a>
<a href="s/92192">「あいのり2」バングラデシュ編ついに完結</a>
<a href="s/92366">東日本大震災 チャリティーオークション</a>
<a href="r/c1">ショッピング</a>
<a href="r/c2">オークション</a>
<a href="r/c5">旅行、出張</a>
<a href="r/c12">ニュース</a>
<a href="r/c13">天気</a>
<a href="r/c14">スポーツ</a>
<a href="r/c15">ファイナンス</a>
<a href="r/c25">テレビ</a>
<a href="r/c33">地図</a>
<a href="r/c34">路線</a>
<a href="r/c41">グルメ</a>
.
. (途中省略)
.
<a href="r/fin">会社概要</a>
<a href="r/fiv">投資家情報</a>
<a href="r/fcsr">社会的責任</a>
<a href="r/fcgi">企業行動憲章</a>
<a href="r/fad">広告掲載について</a>
<a href="r/fhr">採用情報</a>
<a href="r/ftm">利用規約</a>
<a href="r/fsec">セキュリティーの考え方</a>
<a href="r/fpv">プライバシーポリシー</a>
<a href="r/fdi">免責事項</a>

以上です。

[Python][web.py] 静的ファイル(js、css、画像など)を使う設定方法

Python用軽量フレームワーク web.py にて、js、css、画像などの静的(static)ファイルを扱う方法を調べたのでメモ。

staticという名前のディレクトリを作成して、この中にjs、css、画像などを置けば使えるみたいです。

Serving Static Files (such as js, css and images) (web.py)

上記リンクにはApacheの設定方法だけ書いてあるので、nginxの設定が必要な方はこちらを参考にして下さい。

[Python] Webpy + Nginx with FastCGI の設定方法 | Pythonコード帳

以上です。