Python urllib2:URLからJSON応答を受信する


88

Pythonを使用してURLを取得しようとしていますが、応答はJSONです。ただし、実行すると

import urllib2
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
html=response.read()
print html

HTMLのタイプはstrで、JSONが必要です。strの代わりにJSONまたはpython辞書として応答をキャプチャできる方法はありますか?


1
されたresponse.read()有効なJSON文字列を返しますか?
Martijn Pieters

はい、それは有効なJSON文字列であり、strまたはtypeであり、dictではありません
Deepak B

オブジェクト(dict)のJSON表現ではなく、文字列のJSON表現である場合、サーバーに強制的に別のデータを返させることはできません。おそらく別のリクエストを行う必要があります。JSON表現を同等のPythonオブジェクトに解析する方法がわからないだけの場合、Martjin Pietersの答えは正しいです。
abarnert 2012

回答:


182

URLが有効なJSONエンコードデータを返している場合は、jsonライブラリを使用してデコードします。

import urllib2
import json

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
data = json.load(response)   
print data

1
@ ManuelSchneid3r:ここで答えはから読み出しがPythonの2、のためであるresponseあなたがバイト文字列、および与えjson.load()バイト文字列を読み取るために期待しています。JSON 、UTFコーデックを使用してエンコードする必要あります。上記の2つのコーデックにBOMコードポイントが含まれている場合、上記はUTF-8、UTF-16、UTF-32で機能します。あなたがリンクする答えは、UTF-8が使用されたと想定しています。これはデフォルトなので、通常は正しいです。Python 3.6以降、jsonUTFエンコーディングが使用されている場合、ライブラリはバイトコードをJSONデータで自動デコードします。
Martijn Pieters

@ ManuelSchneid3r:そうでなければ、requestsライブラリを使用することをお勧めします。これは、BOMがなく、応答ヘッダーで文字セットが指定されていない場合に使用する正しいUTFコーデックも自動的に検出します。response.json()メソッドを使用するだけです。
Martijn Pieters

35
import json
import urllib

url = 'http://example.com/file.json'
r = urllib.request.urlopen(url)
data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8'))
print(data)

urllib、Python 3.4
HTTPMessageの場合、r.info()によって返されます


1
print dataPython 3で正しくないこと以外の確実なコードprint(data)
David Metcalfe

1
はい、2行目はですimport urllib.request。また、URL内のその.jsonファイルは存在しなくなりました。
ハックトランプ

5
"""
Return JSON to webpage
Adding to wonderful answer by @Sanal
For Django 3.4
Adding a working url that returns a json (Source: http://www.jsontest.com/#echo)
"""

import json
import urllib

url = 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value'
respons = urllib.request.urlopen(url)
data = json.loads(respons.read().decode(respons.info().get_param('charset') or 'utf-8'))
return HttpResponse(json.dumps(data), content_type="application/json")

1
なんてこと、json.dumps()は私の日を救った。
ロイド

Django 1.7 +の場合、次のようにJsonResponseを直接使用できますfrom django.http import JsonResponse return JsonResponse({'key':'value'})
アライグマ

1
私はjson.dumps()の代わりにjson.dump()をしていました。
Hashir Baig

4

検証などには注意が必要ですが、簡単な解決策は次のとおりです。

import json
the_dict = json.load(response)


1

Python 3標準ライブラリワンライナー:

load(urlopen(url))

# imports (place these above the code before running it)
from json import load
from urllib.request import urlopen
url = 'https://jsonplaceholder.typicode.com/todos/1'

0

もう答えたと思うが、これに少し加えたい

import json
import urllib2
class Website(object):
    def __init__(self,name):
        self.name = name 
    def dump(self):
     self.data= urllib2.urlopen(self.name)
     return self.data

    def convJSON(self):
         data=  json.load(self.dump())
     print data

domain = Website("https://example.com")
domain.convJSON()

注:オブジェクトが渡さjson.load()サポートする必要があります(.read) 、したがって、urllib2.urlopen(self.name).read()は動作しません。渡されたドーミンはこの場合httpのプロトコルで提供されるべきです


0

次のrequestsように使用してjsonを取得することもできます。

import requests

r = requests.get('http://yoursite.com/your-json-pfile.json')
json_response = r.json()

0

これはあなたの質問に対するもう一つのより簡単な解決策です

pd.read_json(data)

ここで、dataは次のコードからのstr出力です

response = urlopen("https://data.nasa.gov/resource/y77d-th95.json")
json_data = response.read().decode('utf-8', 'replace')

-1

ここで提供されている例はどれも私にとってはうまくいきませんでした。それらは、Python 2(uurllib2)の場合、またはPython 3の場合、エラー「ImportError:No module named request」を返していました。エラーメッセージをグーグルで検索したところ、明らかにモジュールをインストールする必要があります。これは、このような単純なタスクには明らかに受け入れられません。

このコードは私のために働きました:

import json,urllib
data = urllib.urlopen("https://api.github.com/users?since=0").read()
d = json.loads(data)
print (d)

2
明らかにPython 2を使用しています。Python3にはありませんurllib.urlopen。モジュールurlopenにありurllib.requestます。
ニックマッテオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.