urlfetch.fetchで取得したcontentの文字コード


urlfetch.fetch(url)でGETしたレスポンスを.contentすると文字化けしていて日本語でスクレイピングできない。そんなときどうするか?

  1. contentの文字コードを特定する。
  2. urlfeth.fetchのheadersを指定する。
  3. unicodeにdecodeする。

文字コードの特定

ChromeでURLを開いてConsole -> Networks -> Response HeaderでContent-Typeを確認。

headersの指定

Content-Typeをそのままコピペ(当然、クォーテーションは自分で入れる)。上の場合の文字コードはEUC-JPだった。

import urlfetch

response = urlfetch.fetch(
    url=url,
    headers={'Content-Type': 'text/html; charset=EUC-JP'})

decodeする

この場合、response.contentの文字コードはEUC-JPなのでunicodeにデコードすればスクレイピングがうまくいく。

raw_html = response.content  # このままだとEUC-JP
raw_html = response.content.decode('euc-jp')  # これでunicodeになる。

Encode, Decodeについてようやく理解した

.encode, .decodeの引数にunicodeが出てくることはない。つまり、文字コードはunicodeを中継して変換することになる(ということにして理解した)。

encodeはunicodeを引数の文字コードにする。
unicode -> utf-8 : text.encode('utf-8')
unicode -> euc-jp : text.encode('euc-jp')

decodeは引数の文字コードをunicodeにする。
utf-8 -> unicode : text.decode('utf-8')
euc-jp -> unicode : text.decode('euc-jp')

エンコードしたらstr('hogehoge')で、デコードしたらunicode(u'hogehoge')で文字列操作すれば良い。

参考

Pythonで日本語文字列 (UnicodeとUTF-8, Shift-JIS, EUC-JPなどの相互変換)