2015 年 2 月の記事一覧です(1 件)

[Python]requestsが正しくエンコード情報を返してくれない場合は apparent_encoding を使うとよいかもしれない

Requestsを使ってサイトにアクセスした際、サイトによってはエンコード情報を適切に判定してくれない場合があるようです。例えば下記のような場合、 SHIFT_JIS が欲しいところで ISO-8859-1 が返ってきます。

In [1]: import requests

In [2]: r = requests.get("http://www.atmarkit.co.jp/")

In [3]: r.encoding
Out[3]: 'ISO-8859-1'

このブログにアクセスした場合はこのようになります。これは正しく返してくれます。

In [4]: r = requests.get("http://blog.aoshiman.org")

In [5]: r.encoding
Out[5]: 'utf-8'

ちゃんと調べてはいないのですが、レスポンスヘッダに文字コード情報が入っていない場合に ISO-8859-1 を返すのかもしれません。とりあえず、正確な文字情報が欲しい場合は apparent_encoding を使うのがいいようです。

In [6]: r = requests.get("http://www.atmarkit.co.jp/")

In [7]: r.encoding
Out[7]: 'ISO-8859-1'

In [8]: r.encoding = r.apparent_encoding

In [9]: r.encoding
Out[9]: 'SHIFT_JIS'

ドキュメントには詳しく書いてないのですが、ソースコードを見てみると、 apparent_encoding はchardetを呼び出しているようです。
requests/models.py at bd3cf95e34aa49c8d764c899672048df107e0d70 · kennethreitz/requests

便利なのですが、やはり処理に時間がかかりますね。決まったところに何度もアクセスするのであれば、最初に調べてあとは決め打ちしたほうが良さそうです。

参考
Python3でrequests使っても日本語文字化けしないようにするには - TPDN launch pad


PAGE TOP