ポートフォリオサイト公開中

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

pythonの文字化けを対策する

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

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

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

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

scraping.py
import requests
from bs4 import BeautifulSoup
url = "https://www.fujitv.co.jp/sazaesan/"
html = requests.get(url)
soup = BeautifulSoup(html.text, "html.parser")
print(soup.title.string)
日曜の夕方の看板アニメ、サザエさんのHPのタイトルを取得しようとしています。
ターミナル
$ python3 ~/scraping.py
サザエさん トップãƒ

ふむ、何が書いてあるのか全くわからん
文字化けが起きてしまいました。
文字化けの原因としては、正しい文字コードで読まれていないことが原因です。現在の文字コードを確認してみます。
scraping.py
import requests
url = "https://www.fujitv.co.jp/sazaesan/"
html = requests.get(url)
print(html.encoding)
>>ISO-8859-1 #出力結果 
utf-8で読んで欲しいのに、ISO-8859-1になってしまっていることがわかりました。

対策

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

対策1

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

scraping.py
import requests
from bs4 import BeautifulSoup
url = "https://www.fujitv.co.jp/sazaesan/"
html = requests.get(url)
html.encoding = html.apparent_encoding
soup = BeautifulSoup(html.text, "html.parser")
print(soup.title.string)
>>サザエさん トップページ - フジテレビ #出力結果 

対策2

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

scraping.py
import requests
from bs4 import BeautifulSoup
url = "https://www.fujitv.co.jp/sazaesan/"
html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
print(soup.title.string)
>>サザエさん トップページ - フジテレビ #出力結果 
原因

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

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

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

コメントを残す

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