非常に手軽に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
に文字化けしていないテキストが入りました。