urlfetch.fetch(url)
でGETしたレスポンスを.content
すると文字化けしていて日本語でスクレイピングできない。そんなときどうするか?
- contentの文字コードを特定する。
- urlfeth.fetchのheadersを指定する。
- 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')で文字列操作すれば良い。