HTTP अनुरोध और पायसन में JSON पार्सिंग


202

मैं Google मैप्स API के माध्यम से Google मैप्स को गतिशील रूप से क्वेरी करना चाहता हूं। एक उदाहरण के रूप में, यह अनुरोध शिकागो, IL से लॉस एंजिल्स, CA के रास्ते की गणना जॉपलिन, MO और ओक्लाहोमा सिटी में दो तरह से करता है, ठीक है:

http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false

यह JSON प्रारूप में परिणाम देता है ।

मैं पायथन में यह कैसे कर सकता हूं? मैं ऐसा अनुरोध भेजना चाहता हूं, परिणाम प्राप्त करें और इसे पार्स करें।

जवाबों:


348

मैं भयानक अनुरोध पुस्तकालय का उपयोग करने की सलाह देता हूं :

import requests

url = 'http://maps.googleapis.com/maps/api/directions/json'

params = dict(
    origin='Chicago,IL',
    destination='Los+Angeles,CA',
    waypoints='Joplin,MO|Oklahoma+City,OK',
    sensor='false'
)

resp = requests.get(url=url, params=params)
data = resp.json() # Check the JSON Response Content documentation below

JSON प्रतिक्रिया सामग्री: https://requests.readthedocs.io/en/master/user/quickstart/#json-response-content


2
मेरे लिए, मुझे json=paramsइसके बजाय करने की आवश्यकता थी params=paramsया मुझे 500 त्रुटि मिली।
डिमांगोलेम 16

140

requestsपायथन मॉड्यूल का ख्याल रखता है दोनों JSON डेटा पुन: प्राप्त करने और इसे डीकोड, अपनी अंतर्निहित JSON विकोडक की वजह से। यहाँ मॉड्यूल के प्रलेखन से लिया गया एक उदाहरण दिया गया है :

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

इसलिए JSON को डिकोड करने के लिए कुछ अलग मॉड्यूल का उपयोग करने का कोई फायदा नहीं है।


4
यदि आपको अनुरोधों के साथ संगत होने की आवश्यकता है 0.x (डेबियन मट्ज़ी), तो आपको उपयोग करना चाहिए json.load()या json.loads()इसके बजाय, जैसा कि 0.x में है, jsonएक फ़ंक्शन के बजाय एक संपत्ति है।
nyuszika7h

2
@nyuszika यदि आप डेबियन का उपयोग कर रहे हैं, यदि संभव हो तो, नए पायथन पुस्तकालयों को प्राप्त करने के लिए पाइप का उपयोग करें। आप पुराने अजगर पुस्तकालयों के साथ कोड नहीं करना चाहते हैं, जब तक कि एक महत्वपूर्ण कारण यह नहीं है कि डेप्टिन का उपयुक्त विकृतियों में क्या है।
शेरनदेज़

@SHernandez यह एक मान्य बिंदु है, लेकिन कुछ पैकेज python-requests(या python3-requests) पैकेज पर निर्भर हो सकते हैं , इसलिए आपको /usr/localउन पैकेजों को तोड़ने से बचने के लिए कहीं और स्थापित करना होगा । दूसरी ओर, जब पोर्टेबिलिटी / संगतता तुच्छ है, मेरी राय में यह इसके लायक है।
nyuszika7h

3
Json प्रतिसाद 'r' से केवल एक विशेष नाम-मान जोड़ी कैसे निकालें?
लख

1
में r.json()(मेरे उत्तर से) आपके पास वास्तविक प्रतिक्रिया है, JSON-डिकोडेड। आप इसे एक सामान्य list/ की तरह एक्सेस कर सकते हैं dict; print r.json()देखना है कि यह कैसा दिखता है। या जिस सेवा के लिए आपने अनुरोध किया है, उसके एपीआई डॉक्स का संदर्भ लें।
linkyndy


25
import urllib
import json

url = 'http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false'
result = json.load(urllib.urlopen(url))

3
आपकी मदद के लिए धन्यवाद, हालांकि निम्नलिखित पर ध्यान दिया जाना चाहिए: urllib2.urlopen () के पक्ष में urllib.urlopen () फ़ंक्शन को Python 3.0 में हटा दिया गया है।
अरुण

2
अरुण, हाँ लेकिन अब इसका नाम urllib2 नहीं है
कोरी गोल्डबर्ग

3
यह urllib.requestPython 3 में है
nyuszika7h

यह काम नहीं करता। json.loads 'TypeError: JSON ऑब्जेक्ट' होना चाहिए, न कि 'HTTPResponse' और json.load देता है 'TypeError: JSON ऑब्जेक्ट को str होना चाहिए, न कि' बाइट्स ''
Hornbacher

16

अनुरोध लाइब्रेरी का उपयोग करें, परिणाम प्रिंट करें ताकि आप उन कुंजियों / मूल्यों का बेहतर पता लगा सकें जिन्हें आप निकालना चाहते हैं और फिर डेटा को पार्स करने के लिए छोरों के लिए नेस्टेड का उपयोग करें। उदाहरण में मैं कदम से कदम ड्राइविंग निर्देश निकालता हूं।

import json, requests, pprint

url = 'http://maps.googleapis.com/maps/api/directions/json?'

params = dict(
    origin='Chicago,IL',
    destination='Los+Angeles,CA',
    waypoints='Joplin,MO|Oklahoma+City,OK',
    sensor='false'
)


data = requests.get(url=url, params=params)
binary = data.content
output = json.loads(binary)

# test to see if the request was valid
#print output['status']

# output all of the results
#pprint.pprint(output)

# step-by-step directions
for route in output['routes']:
        for leg in route['legs']:
            for step in leg['steps']:
                print step['html_instructions']

माइकल, डेटा मिलते ही मैं इसमें से कुछ कैसे समझ सकता हूँ? मैं इसे "क्लासिक" json दृश्य प्रारूप में कैसे प्रदर्शित कर सकता हूं (जैसे कि आप अपने ब्राउज़र में प्राप्त करते हैं)? [कड़ी]: यहाँ है कि मैं क्या में मेरे टर्मिनल मिलता है s13.postimg.org/3r55jajk7/terminal.png
अलेक्जेंडर स्टारबक

3
@AlexStarbuck import pprintतब ->pprint.pprint(step['html_instructions'])
माइकल

7

इसे इस्तेमाल करे:

import requests
import json

# Goole Maps API.
link = 'http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false'

# Request data from link as 'str'
data = requests.get(link).text

# convert 'str' to Json
data = json.loads(data)

# Now you can access Json 
for i in data['routes'][0]['legs'][0]['steps']:
    lattitude = i['start_location']['lat']
    longitude = i['start_location']['lng']
    print('{}, {}'.format(lattitude, longitude))

1
अनुरोधों का अपना स्वयं का json फ़ंक्शन है
LilaQ

0

कंसोल पर सुंदर Json के लिए भी:

 json.dumps(response.json(), indent=2)

इंडेंट के साथ डंप का उपयोग करना संभव है। (कृपया जसन आयात करें )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.