PythonでWebスクレイピングでrequestsで得たレスポンスの文字化け対策のメモを残します。
requestsモジュールにwebページの取得
Pythonのrequestsモジュールはwebサーバーへの通信を行うモジュールです。ここでは、requests.getを使って、指定のwebページを取得しています。requestsはpythonでpipコマンドなどを使ってインストールします。
pip install requests
それではwebページを取得してみます。今回は、サンプルとして、以前に引き続き、首相官邸のHPから『令和4年6月15日の岸田内閣総理大臣記者会見』を取得していきます。なぜ、このページなのかというと、ブログに転載しても著作権上差しさわりのないからです。。。
今回も対話型Python開発環境のJupyterLabで進めていきます。
# ライブラリのインポート
import requests
# ターゲットのURLを設定
url= 'https://www.kantei.go.jp/jp/101_kishida/statement/2022/0615kaiken.html'
# htmlを取得
res = requests.get(url)
resにhtmlを取得しました。ちゃんと取得できたのをHTTPのステータスコードで確認してみます。
# HTTPステータスコードの確認
print(res.status_code)
200
取得したhtmlの文字化け
ステータスコードは200で正常にレスポンスが通ったことが確認できました。
中身を見ていきます。
# レスポンスの中身の表示
print(res.text)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="ç·çã®æ¼èª¬ãè¨è ä¼è¦ãªã©ãããã¼ã«ããã®åç»ãããã¹ãã§ã覧ã«ãªãã¾ãã"> <meta name="keywords" content="é¦ç¸å®é¸,æ¿åº,å é£,ç·ç,è¨è ä¼è¦"> <meta property="og:title" content="令å4å¹´6æ15æ¥ å²¸ç°å é£ç·ç大è£è¨è ä¼è¦ | ç·çã®æ¼èª¬ã»è¨è ä¼è¦ãªã© | é¦ç¸å®é¸ãã¼ã ãã¼ã¸"> <meta property="og:type" content="article"> <meta property="og:url" content="https://www.kantei.go.jp/jp/101_kishida/statement/2022/0615kaiken.html"> <meta property="og:image" content="https://www.kantei.go.jp/jp/content/000107503.jpg"> <meta property="og:site_name" content="é¦ç¸å®é¸ãã¼ã ãã¼ã¸"> ・・・(以下、略)
う~ん、中身が文字化けしています。
文字化け原因の確認
encoding属性でrequestsが予想しているエンコードを確認してみます。
# エンコードの確認
print(res.encoding)
ISO-8859-1
ISO-8859-1と表示され、どうやら日本語だと認識されていないようです。HTTPの中で<meta charset=”UTF-8″>と表示されているのですが、うまくrequestsはそれを忖度してくれていないようです。
文字化けの対策
そこで明示的にencodingを指定してやります。
# encodingを明示
res.encoding = 'utf-8'
もう一度、中身を見ます。
# レスポンスの中身の再表示
print(res.text)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="総理の演説や記者会見などを、ノーカットの動画やテキストでご覧になれます。"> <meta name="keywords" content="首相官邸,政府,内閣,総理,記者会見"> <meta property="og:title" content="令和4年6月15日 岸田内閣総理大臣記者会見 | 総理の演説・記者会見など | 首相官邸ホームページ"> <meta property="og:type" content="article"> <meta property="og:url" content="https://www.kantei.go.jp/jp/101_kishida/statement/2022/0615kaiken.html"> <meta property="og:image" content="https://www.kantei.go.jp/jp/content/000107503.jpg"> <meta property="og:site_name" content="首相官邸ホームページ"> ・・・以下略
うん、今度はうまくいきました。
もっと便利なコマンド(.apparent_encoding)がありました
どうやら明示的に文字コードを入力しなくても、「見かけのエンコード」を選んでくれるコマンドがあるらしい。
レスポンス.apparent_encoding
print(res.encoding)
print(res.apparent_encoding)
ISO-8859-1 utf-8
res.encoding = res.apparent_encoding
print(res.encoding)
utf-8
参考
Requests-Docs-ja(日本語版)
Requests-Docs-ja API
note.nkmk.me Python, Requestsの使い方
コメント