カテゴリー : 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コード帳

以上です。
 

[Python] string.replace() で改行コードの変換・置換・削除

Pythonで改行コードを変換、置換、削除する方法を調べたのでメモ。

string.replace()で文字列中に含まれている改行コードを適宜、置換すれば良いそうです。

改行コードを削除したい場合は、以下のように空文字”で置換すればOKです。

>>> text = 'こんにちは。\r\nありがとう!'
>>> print text
こんにちは。
ありがとう!
>>> text = text.replace('\r\n','')
>>> print text
こんにちは。ありがとう!

参考記事

[書籍]「みんなのPython Webアプリ編」のPDFが無料公開中

絶版書籍「みんなのPython Webアプリ編」のPDFがクリスマスプレゼントということで、無料公開中らしいです。

・DL:クリスマスプレゼント!「みんなのPython Webアプリ編」のPDFを無料公開します | TRIVIAL TECHNOLOGIES on CLOUD はてなブックマーク - クリスマスプレゼント!「みんなのPython Webアプリ編」のPDFを無料公開します | TRIVIAL TECHNOLOGIES on CLOUD

・参考:無料で「みんなのPython Webアプリ編」のPDFファイルがダウンロード可能に – GIGAZINE はてなブックマーク - 無料で「みんなのPython Webアプリ編」のPDFファイルがダウンロード可能に - GIGAZINE

最近、Pythonでコードを書いていないので、この機会にPython再開したいですね。

[文字コード] UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 [Python]

下記のサイトで書かれていたPythonのプログラムを対話モードで実行すると、
UnicodeDecodeErrorが発生して解決したのでメモ。

PythonでAmazon Product Advertising APIを使う – 人工知能に関する断想録

amazon.pyを使って”Amazonクラスを使って「人工知能」というキーワードで本を検索してみます。”以下のプログラムを実行すると下記のエラーが返ってきました。

xml = amazon.itemSearch("Books", Keywords="人工知能", ItemPage="1")  # 本

■ エラー内容

Traceback (most recent call last):
File ““, line 1, in
File “amazon.py”, line 44, in itemSearch
return self.sendRequest(params)
File “amazon.py”, line 76, in sendRequest
self.url = self.buildURL(params)
File “amazon.py”, line 58, in buildURL
pair = “%s=%s” % (p[0], urllib2.quote(p[1].encode(“utf-8”)))
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

エラーの原因を調べてみると、文字コードの扱いについてのエラーでした。

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

ここを読んで解決しました。unicodeの扱いが詳しく書かれていて勉強になりました。

・参考:PythonのUnicodeEncodeErrorを知る – HDEラボ はてなブックマーク - PythonのUnicodeEncodeErrorを知る - HDEラボ

下記のように、Keywords=u”人工知能” とKeywordsをUnicode型にしてあげると正常に動作しました。

xml = amazon.itemSearch("Books", Keywords=u"人工知能", ItemPage="1")

以上です。

[正規表現] Pythonで特定の単語を含む文章を取得する方法

 

Amazonマーケットプレイスの商品コンディションコメントにて、特定の単語を含むときにその単語を含む文章全体だけをターミナルに出力するプログラムを書きました。
 

今回は、[Python] Amazon API で商品のコンディションコメントを取得してみた | CodeNote.net はてなブックマーク - [Python] Amazon API で商品のコンディションコメントを取得してみた | CodeNote.netから、例として ‘新品’ という単語を含むケースを取り上げました。
 

まず、正規表現を使うために reモジュールをインポートします。
 

1
import re

 

次に、re.searchメソッドを使って、特定の単語 ‘新品’ を含む場合のみ conditionnote の内容を出力するように変更します。
 

1
2
3
4
5
# soupから要素 conditionnote の情報のみを取り出す
for item in soup.findAll("conditionnote"):
	# 要素 conditionnote に'新品'という単語を含むとき条件が真
	if re.search(u'新品', item.contents[0]):
		print item.contents[0]	# item要素以下の要素 conditionnote の内容を出力

 

結果は下記の通りです。
 

コンディションコメントに ‘新品’ を含む場合だけ出力されています。
 

新品未読品です。在庫確実。迅速発送いたします。
新品未読品の状態の書籍です。水濡れ防止にて丁寧に梱包し、迅速に発送いたします。(原則3営業日以内)在庫切れ時は速やかにご注文をキャンセルさせて頂きます。定価より高価になっている場合がございますので、必ず定価をご確認ください。 (土、日、祝は原則お休みです。)
新品未読の商品ですので非常に綺麗です。迅速丁寧に対応いたします。International shipping available.
新品美品です。ビニール梱包、メール便にて迅速発送させていただきます。(ご注文をいただいた時間にもよりますが、翌日〜一週間の発送になります)品切れの場合はご了承下さい。希少品につき、若干定価より高めになっておりますが、ご検討くださいませ。
実質新品として取り扱われたものを仕入直後より未読のままビニール封入しております。ただし、一度棚に並んだり再配本された商品ですので本出品としてはコンディション「非常に良い」とします、陳列や配送などでのスレなどの瑕疵についてはご容赦下さい。相場状況などに合わせて(定価に近い参考価格4830円)より高価格な設定となっております。よくご検討の上ご購入ください。在庫共有しておりますので品切れもございます。その場合、注文キャンセルとさせていただきますがご了承ください。在庫切れ、高価格設定の点についてお気にされない方のみご注文お願い致します。

 

以上です。
 

・参考:Road to make a twitter bot 03 « WackyPress
 

[正規表現] Pythonの reモジュールを用いた入門者向けチュートリアル

 

Pythonである特定の単語と一致した部分を抜き出すプログラムを書きたいなと考えています。
 

これには正規表現の知識が必要なので日本Pythonユーザ会(PyJUG)が掲載している、reモジュールを用いた正規表現入門者向けチュートリアルを読みました。
 

正規表現 HOWTO はてなブックマーク - 正規表現 HOWTO
 

以下、内容です。
 

・ 1. はじめに

・ 2. 簡単なパターン
  文字とのマッチ / 繰り返し

・ 3. 正規表現を使う
  正規表現のコンパイル / バックスラッシュだらけ / マッチングを行う / モジュールレベルの関数 / コンパイル時のフラグ

・ 4. パターンにもっと力を
  他のメタ文字 / グルーピング / 取り出さないグループと名前付きグループ / その他

・ 5. 文字列の変更
  文字列の分割 / 検索と置換

・ 6. ありがちな問題
  string モジュールについて知る / match() vs search() / Greedy vs Non-Greedy / re.VERBOSE を使わないと…

・ 7. フィードバック

 

和訳されたものなので一部、日本語の言い回しが変なところはありますが、分かりやすくて勉強になりました。