python

Pythonで「json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)」が表示された時

これがよく起きるのは、requestsモジュールを使用して、webサイトの情報を引っ張ってきた時に、Content-Typeがjson出ないのに、json形式に変換しようとした時に起きます。

サンプルコードを載せます。

import requests

s = requests.Session()
s.headers.update({'user-agent': 'my-crawler/1.0 (+foo@example.com)'})

r = s.get('https://gihyo.jp/')
print(r.json())

これを実行すると、エラーになります。
URLを別のものにしたもので再度実行してみます。

r = s.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=130010')
print(r.json())

今回は上手くいきます。
それぞれのURLを覗いてみると、片方は普通のサイトですが、もう片方はJSON形式で情報がまとまっているサイトです。

原因

レスポンスの形式がJSON形式になっていないのとエラーが起こります。
なので、json形式で情報を取得する場合には、レスポンスのヘッダー情報を確認した上で、必要があればjson形式に変換して取得しましょう。
print文をprint(r.headers)に変更することでヘッダー情報を確認できます。

対応

基本的にJSON形式で提供されていないものをJSONに無理矢理直そうとすると上手くいきません。
まず、r.text_content()で元の情報の形式で取得し、必要な箇所を特定した上で正規表現などを用いて抜き出す必要があります。後はプログラマー側で構造を決めた上で整形すれば可能です。
とは言っても、正規表現などの部分で手間はかかりますので、行うかどうかは検討した方が良いです。