पायथन लिपि में वेबपेज से JSON कैसे प्राप्त करें


192

मेरी एक स्क्रिप्ट में निम्नलिखित कोड मिला:

#
# url is defined above.
#
jsonurl = urlopen(url)

#
# While trying to debug, I put this in:
#
print jsonurl

#
# Was hoping text would contain the actual json crap from the URL, but seems not...
#
text = json.loads(jsonurl)
print text

मैं जो करना चाहता हूं उसे वह {{.....etc.....}}सामान मिलता है जो मुझे URL पर दिखाई देता है जब मैं इसे अपनी स्क्रिप्ट में फ़ायरफ़ॉक्स में लोड करता हूं तो मैं इससे एक मूल्य पार कर सकता हूं। मैंने एक टन गुग्ल किया है, लेकिन मुझे एक अच्छा जवाब नहीं मिला है कि वास्तव में एक पायथन स्क्रिप्ट में किसी ऑब्जेक्ट में {{...}}समाप्त होने वाले URL से सामान कैसे प्राप्त करें .json

जवाबों:


314

URL से डेटा प्राप्त करें और फिर json.loadsउदा को कॉल करें

पायथन 3 उदाहरण :

import urllib.request, json 
with urllib.request.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=google") as url:
    data = json.loads(url.read().decode())
    print(data)

पायथन 2 उदाहरण :

import urllib, json
url = "http://maps.googleapis.com/maps/api/geocode/json?address=google"
response = urllib.urlopen(url)
data = json.loads(response.read())
print data

आउटपुट कुछ इस तरह होगा:

{
"results" : [
    {
    "address_components" : [
        {
            "long_name" : "Charleston and Huff",
            "short_name" : "Charleston and Huff",
            "types" : [ "establishment", "point_of_interest" ]
        },
        {
            "long_name" : "Mountain View",
            "short_name" : "Mountain View",
            "types" : [ "locality", "political" ]
        },
        {
...

30
उपयोग करने के बजाय json.loadsजो एक स्ट्रिंग उपयोग करता है (जिसके कारण .read()आवश्यकता होती है, json.load(response)इसके बजाय उपयोग करें ।
जाट 6'15

केवल PSL, संक्षिप्त और कुशल
jlandercy

है urllib2को Python2 में बेहतर?
जॉन-एरिक

110

मैं यह अनुमान लगाऊंगा कि आप वास्तव में URL से डेटा प्राप्त करना चाहते हैं:

jsonurl = urlopen(url)
text = json.loads(jsonurl.read()) # <-- read from it

या, अनुरोध लाइब्रेरी में JSON डिकोडर देखें

import requests
r = requests.get('someurl')
print r.json() # if response type was set to JSON, then you'll automatically have a JSON response here...

इस सवाल के लिए हरे बिल्ला के हकदार हैं! धन्यवाद!
अजीज ऑल्टो

27

इसे Python 2.X और Python 3.X वाले वेबपेज से JSON फॉर्मेट में एक डिक्शनरी मिलती है:

#!/usr/bin/env python

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json


def get_jsonparsed_data(url):
    """
    Receive the content of ``url``, parse it as JSON and return the object.

    Parameters
    ----------
    url : str

    Returns
    -------
    dict
    """
    response = urlopen(url)
    data = response.read().decode("utf-8")
    return json.loads(data)


url = ("http://maps.googleapis.com/maps/api/geocode/json?"
       "address=googleplex&sensor=false")
print(get_jsonparsed_data(url))

इसे भी देखें: JSON के लिए उदाहरण पढ़ें और लिखें


24

मैंने पायथन 3 का उपयोग करते समय एक वेबपेज से JSON प्राप्त करने का यह सबसे आसान और सबसे कुशल तरीका पाया है:

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

4
यह काम नहीं करता है। आपको urlib.request से urlopen आयात करने की आवश्यकता है, अर्थातfrom urllib.request import urlopen
Dawid Laszuk

5

वह सब करने के लिए कॉल urlopen()( डॉक्स के अनुसार ) एक फ़ाइल जैसी वस्तु लौटाता है। एक बार आपके पास, आपको read()नेटवर्क पर वास्तव में JSON डेटा खींचने के लिए इसकी विधि को कॉल करने की आवश्यकता होती है ।

कुछ इस तरह:

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text

5

पायथन 2 में json.loads () के बजाय json.load () काम करेगा

import json
import urllib

url = 'https://api.github.com/users?since=100'
output = json.load(urllib.urlopen(url))
print(output)

दुर्भाग्य से, यह अजगर 3 में काम नहीं करता है। json.load सिर्फ json.loads के आस-पास एक आवरण है जो किसी फ़ाइल जैसी वस्तु के लिए रीड () कॉल करता है। json.loads को एक स्ट्रिंग ऑब्जेक्ट की आवश्यकता होती है और urllib.urlopen (url) .read () का आउटपुट एक बाइट्स ऑब्जेक्ट है। तो किसी को फ़ाइल एन्कोडिंग प्राप्त करने के लिए इसे पायथन 3 में काम करना होगा।

इस उदाहरण में हम एन्कोडिंग के लिए हेडर को क्वेरी करते हैं और अगर हमें एक नहीं मिलता है तो utf-8 पर वापस आते हैं। पायथन 2 और 3 के बीच हेडर ऑब्जेक्ट अलग है, इसलिए इसे अलग-अलग तरीके से करना होगा। अनुरोधों का उपयोग करने से यह सब होगा, लेकिन कभी-कभी आपको मानक पुस्तकालय से चिपके रहने की आवश्यकता होती है।

import json
from six.moves.urllib.request import urlopen

DEFAULT_ENCODING = 'utf-8'
url = 'https://api.github.com/users?since=100'
urlResponse = urlopen(url)

if hasattr(urlResponse.headers, 'get_content_charset'):
    encoding = urlResponse.headers.get_content_charset(DEFAULT_ENCODING)
else:
    encoding = urlResponse.headers.getparam('charset') or DEFAULT_ENCODING

output = json.loads(urlResponse.read().decode(encoding))
print(output)

मुझे पता है कि छह मानक पुस्तकालय का हिस्सा नहीं है, लेकिन यह सुविधा के लिए यहां दिखाया गया है। इसके बिना, आपको urlopen () प्राप्त करने के लिए निर्धारित करने के लिए एक if / और या try / block की आवश्यकता होगी।
एविसो

3

Json को पार्स करने के लिए अतिरिक्त लाइब्रेरी का उपयोग करने की आवश्यकता नहीं है ...

json.loads()एक शब्दकोश देता है ।

तो आपके मामले में, बस करो text["someValueKey"]


3

देर से जवाब, लेकिन python>=3.6आप के लिए उपयोग कर सकते हैं:

import dload
j = dload.json(url)

इसके dloadसाथ स्थापित करें :

pip3 install dload

-1

आप उपयोग कर सकते हैं json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

जोंस लोड करने के लिए और इसे फाइल पर लिखना निम्न कोड उपयोगी है:

data = json.loads(json.dumps(Response, sort_keys=False, indent=4))
with open('data.json', 'w') as outfile:
json.dump(data, outfile, sort_keys=False, indent=4)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.