技術ブログ移設しました click here!

【requestsモジュール】pythonの文字化けを対策する

pythonの文字化けを対策する

こんにちは、ともろう(@tomorrowSLog)です。

pythonでwebサイトのスクレイピングをする際に、文字化けが起こってしまいました。
日本語のサイトでも文字化けが起こらないサイトと起こるサイトがあるみたいです。
今回はその文字化けに対する対策をまとめていきます。

目次
  1. 現状
  2. 対策
  3. 原因
  4. まとめ
現状

さて問題のコードはこちらです。

scraping.py

日曜の夕方の看板アニメ、サザエさんのHPのタイトルを取得しようとしています。
ターミナル

ふむ、何が書いてあるのか全くわからん
文字化けが起きてしまいました。
文字化けの原因としては、正しい文字コードで読まれていないことが原因です。現在の文字コードを確認してみます。
scraping.py
utf-8で読んで欲しいのに、ISO-8859-1になってしまっていることがわかりました。

対策

色々調べてみた結果、2通りの解決策を見つけることができました。

対策1

html.encoding = html.apparent_encoding
html.encodingにutf-8が入っていればうまくいくはずなので、html情報から文字コードを推定してくれる.apparent_encodingを使い、そのままぶっ込みます。

scraping.py

対策2

今回はBeautifulSoupを使ってHTMLを調べているので、BeautifulSoupの文字コードを推定してくれる機能を使います。

scraping.py

原因

requestsモジュールはHTMLのレスポンスヘッダ内の文字コードを取得して文字コードを識別していて、レスポンスヘッダ内に記述がない場合’ISO-8859-1’を返しているのが原因でした。

参考記事: requestsソースコード
参考記事:Pythonのrequestsモジュールでの文字コード対策

まとめ
anacondaやpyenvを使っていた時は同じことをしても文字化けしてなかったので勉強になりました。
HTMLも人が作っているので、あまり過信しすぎず細かい設定をみていけたらと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です