Requestsのレスポンスの文字化け対策メモ

スポンサーリンク
Python
スポンサーリンク

 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の使い方

Python
スポンサーリンク
鷹の目週末プログラマー

コメント