पायथन urllib2: url से JSON प्रतिक्रिया प्राप्त करें


89

मैं पायथन का उपयोग करके एक URL प्राप्त करने की कोशिश कर रहा हूं और प्रतिक्रिया JSON है। हालाँकि, जब मैं दौड़ता हूँ

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

Html टाइप str का है और मुझे JSON की उम्मीद है। क्या कोई रास्ता है जिससे मैं JSON या एक अजगर शब्दकोश के रूप में प्रतिक्रिया को कैप्चर कर सकता हूं।


1
है response.read()एक मान्य JSON स्ट्रिंग लौटने?
मार्टिन पीटर्स

हाँ, इसका वैध JSON स्ट्रिंग इसका मात्र या प्रकार str है और तानाशाह नहीं
दीपक B

यदि यह किसी वस्तु (तानाशाह) के JSON प्रतिनिधित्व के बजाय एक स्ट्रिंग का JSON प्रतिनिधित्व करता है, तो आप सर्वर को विभिन्न डेटा को वापस करने के लिए बाध्य नहीं कर सकते; आपको शायद एक अलग अनुरोध करने की आवश्यकता है। यदि यह सिर्फ इतना है कि आपको पता नहीं है कि बराबर पायथन ऑब्जेक्ट में JSON प्रतिनिधित्व को पार्स कैसे किया जाए, तो मार्टजिन पिएटर्स का उत्तर सही है।
१ert

जवाबों:


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: यहाँ का उत्तर पायथन 2 के लिए है, जहाँ से पढ़ने पर responseआपको बाईटस्टर मिलते हैं, और json.load()एक बाईटस्ट्रिंग पढ़ने की उम्मीद होती है। JSON को UTF कोडेक का उपयोग करके एन्कोड किया जाना चाहिए, और बाद के UTF-8, UTF-16 और UTF-32 के लिए उपरोक्त कार्य, बश कोडपॉइंट बाद के दो कोडेक के लिए शामिल किया गया है। उत्तर आप UTF-8 को मानते हैं , का उपयोग किया गया था, जो आमतौर पर सही है क्योंकि यह डिफ़ॉल्ट है। पायथन 3.6 के रूप में, jsonJSON डेटा के साथ लाइब्रेरी ऑटो-डिकोड्स बायोटकोड यूटीएफ एन्कोडिंग का उपयोग किया जाता है।
मार्टिन पीटर्स

@ ManuelSchneid3r: मैं अन्यथा आपको requestsलाइब्रेरी का उपयोग करने की सलाह दूंगा , जो उन मामलों में उपयोग करने के लिए स्वचालित रूप से सही UTF कोडेक का पता लगाता है जहां BOM गायब है और कोई भी वर्ण प्रतिक्रिया शीर्षक में निर्दिष्ट नहीं किया गया था। बस response.json()विधि का उपयोग करें ।
मार्टिन पीटर्स

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 , अजगर 3.4 के लिए
HTTPMessage , r.info द्वारा लौटाए गए ()


1
print dataपाइथन 3. के लिए गलत होने के अलावा अन्य ठोस कोड होना चाहिए print(data)
डेविड मेटकाफ

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
whew, उस json.dumps () ने मेरा दिन बचाया।
लॉयड

Django 1.7 + के मामले में, आप सीधे JsonResponse का उपयोग कर सकते हैंfrom django.http import JsonResponse return JsonResponse({'key':'value'})
रैकून

1
मैं json.dump () के बजाय json.dump () कर रहा था, गूंगा महसूस कर रहा था, बचाने के लिए धन्यवाद!
हशीर बेग

4

सत्यापन और आदि के बारे में सावधान रहें, लेकिन इसका सीधा हल यह है:

import json
the_dict = json.load(response)


1

पायथन 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)

जहां डेटा निम्न कोड से स्ट्रेट आउटपुट है

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

-1

यहां दिए गए उदाहरणों में से किसी ने भी मेरे लिए काम नहीं किया। वे या तो पायथन 2 (uurllib2) के लिए थे या जो पायथन 3 के लिए थे, उन्होंने त्रुटि "ImportError: No मॉड्यूल नाम का अनुरोध" वापस किया। मैंने त्रुटि संदेश को गूगल कर दिया है और मुझे स्पष्ट रूप से एक मॉड्यूल स्थापित करने की आवश्यकता है - जो कि इस तरह के एक सरल कार्य के लिए स्पष्ट रूप से अस्वीकार्य है।

इस कोड ने मेरे लिए काम किया:

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

2
आप स्पष्ट रूप से पायथन 2 का उपयोग कर रहे हैं। पायथन 3 में, नहीं है urllib.urlopen; urlopenमें है urllib.requestमॉड्यूल।
निक मैट्टो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.