requestsのレスポンスが文字化けする場合に文字コードを修正する

非常に手軽にhttpアクセスができるrequestsですが、日本語の文書を取得する時に文字コードが正常に取れないケースがあります。

たとえば、今回は青空文庫の羅生門のページで発生しました。


import requests
url = "https://www.aozora.gr.jp/cards/000879/files/127_15260.html"
response = requests.get(url)
html = response.text

これで取得したhtml変数の中身を見るとひどいことに。

~略~
<div class="main_text"><br/>\r\n\x81@\x82\xa0\x82é\x93ú\x82Ì\x95é\x95û\x82Ì\x8e\x96\x82Å\x82\xa0\x82é\x81B\x88ê\x90l\x82Ì<ruby><rb>\x89º\x90l</rb><rp>\x81i</rp><rt>
~略~

問題は文字コードを正常に取れていないことのようです。
サイトのメタタグでは Shift_JIS が指定されていますが、
print(response.encoding)
を実行すると、
ISO-8859-1
が戻ってきます。

このような時は、apparent_encodingを使います。
ドキュメントを見る限りでは他のライブラリの機能を取り込んでるようですね。

response.apparent_encoding に、正しい文字コードである SHIFT_JISが格納されているので、
これをencodingにセットしてあげれば大丈夫です。


import requests
url = "https://www.aozora.gr.jp/cards/000879/files/127_15260.html"
response = requests.get(url)
# この下の行を追加
response.encoding = response.apparent_encoding
html = response.text

これで、htmlに文字化けしていないテキストが入りました。

requestsを使って、Webサイトのソースコードを取得する

今回はとりあえず単純に httpで getするだけのコードを紹介します。
サンプルとして、yahooのトップページのHTMLを取得します。

利用するのは、 requests というpythonのライブラリです。
ドキュメントにある通り、超手軽に使えます。

こちらのコードで、htmlという変数に結果が入ります。


import requests
url = "https://www.yahoo.co.jp/"
response = requests.get(url)
html = response.text