人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

pythonでtwitterbotを作成しています。
日本語の投稿時にエラーが出て困っています。
内容としては

$ python test.py
Traceback (most recent call last):
File "test.py", line 26, in <module>
api.update_status(text.decode('utf-8'))
File "/twitterbot/tweepy/binder.py", line 76, in _call
url = '%s?%s' % (api.api_root + path, urllib.urlencode(parameters))
File "/usr/lib/python2.6/urllib.py", line 1267, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-33: ordinal not in range(128)
となっています。ソースと読み込んでいるファイルはUTF-8にするなどしたのですが、もしエラー内容解決できる知恵をお持ちの方いましたら助けていただけると助かります。

ソースコード抜粋
import random
import tweepy
import codecs

data_path = 'data/comment.txt'
all = open(data_path).read()
records = all.split("\n")
text = random.choice(records)

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
api.update_status(text.decode('utf-8'))

●質問者: okacham
●カテゴリ:インターネット ウェブ制作
✍キーワード:ALL API ASCII codec LIB
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●23ポイント

http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html

こちらは 参考になりますでしょうか?


2 ● Lhankor_Mhy
●23ポイント ベストアンサー

PythonでURIエンコードするには - HM python - pythonグループ

http://python.g.hatena.ne.jp/mhrs/20060609/p1

↑こちらの記述を参考に考えますと、textがutf-8であるなら、

api.update_status(text.decode('utf-8')) 

の部分を

api.update_status(text)

と、変えると動く予感がするのですが、どうでしょうか。


3 ● showyou
●22ポイント

http://github.com/showyou/hama_db/blob/master/generator/quickGen...

手元のソースをちょっといじってtweepyで送信してみたのですが、utf-8でもunicodeでも普通に送信できそうです。



それよりむしろ

text = random.choice(records)

こっちが気になります。recordsって要素数1の配列になっていませんか?

pythonのrandom.choiceを文字列に対して使うとき、例えば

random.choice((u"あいうえお"))

なんてやると、予想としてはu("あいうえお")が取り出されると思いますが、実際はそのうちの1文字が取り出されてしまいます。


4 ● taos
●22ポイント

これはurllib.py内部で発生しているため、外部からは回避が難しいです。

sitecustomize.pyが編集できる場合は、

sys.setdefaultencoding('utf-8')

※sitecustomize.pyについては

http://d.hatena.ne.jp/SumiTomohiko/20070120/1169300624

を参照してください。

そうでない場合は事前に、

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

とした上で、api.update_statusを実行してみてください。

きっと解決できると思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ