2012-05-08 6 views
5

तो, मैं केनेथ के उत्कृष्ट requests module का उपयोग करना चाहता हूं। Freebase API का उपयोग करने का प्रयास करते समय इस समस्या को ठोकर खाई।अनुरोधों के साथ एक यूआरएल पर एक JSON ऑब्जेक्ट पास करें

मूल रूप से, उनके एपीआई कि तरह लग रहा है:

https://www.googleapis.com/freebase/v1/mqlread?query=... 

एक प्रश्न के रूप में, वे एक JSON ऑब्जेक्ट की उम्मीद है, यहाँ एक return a list of wines with their country and percentage of alcohol होगा कि बताया गया है:

[{ 
    "country":  null, 
    "name":   null, 
    "percentage_alcohol": null, 
    "percentage_alcohol>": 0, 
    "type":   "/food/wine" 
}]​ 
बेशक

, हम करना होगा इसे यूआरएल में पास करने से पहले नरक से बचें, इसलिए वास्तविक क्वेरी इस तरह दिखेगी:

fullurl = 'https://www.googleapis.com/freebase/v1/mqlread?query=%5B%7B%22percentage_alcohol%3E%22%3A+0%2C+%22country%22%3A+null%2C+%22type%22%3A+%22%2Ffood%2Fwine%22%2C+%22name%22%3A+null%2C+%22percentage_alcohol%22%3A+null%7D%5D' 
अब

,

r = requests.get(fullurl) 
print r.status_code 
>>> 400 

क्योंकि साइट यह क्वेरी पार्स नहीं कर सके दावा करता है।

r2 = urllib2.urlopen(fullurl) 
print r2.getcode() 
>>> 200 

कोई समस्या नहीं, मुझे उचित वापसी मिलती है। दिलचस्प बात यह है कि

# This is the url of our requests.get request 
print urllib2.urlopen(r.url).getcode() 
>>> 200 

क्यों? क्या मैं मॉड्यूल का गलत इस्तेमाल कर रहा हूं? या यह requests में एक बग है?

+0

यदि आप पहले से नहीं हैं, तो 'json' मॉड्यूल का उपयोग करें। – jdi

उत्तर

6

यह मेरे लिए काम करता है। यहां मैंने जो किया है:

>>> params = [{"country": None, 
...   "name": None, 
...   "percentage_alcohol": None, 
...   "percentage_alcohol>": 0, 
...   "type": "/food/wine" 
...   }] 
>>> import json 
>>> params_json = json.dumps(params) 

>>> import requests 
>>> url = "https://www.googleapis.com/freebase/v1/mqlread?query=%s" 
>>> r = requests.get(url % params_json) 
>>> r.status_code 
200 

>>> content_json = json.loads(r.content) 
>>> import pprint 
>>> pprint.pprint(content_json) 
{u'result': [{u'country': u'New Zealand', 
       u'name': u'2003 Cloudy Bay Sauvignon Blanc', 
       u'percentage_alcohol': 13.5, 
       u'type': u'/food/wine'}, 
      {u'country': u'France', 
       u'name': u'G.H. Mumm Cordon Rouge Brut', 
       u'percentage_alcohol': 12.0, 
       u'type': u'/food/wine'}, 
.... 

मैंने ब्रेवटी के लिए बाकी काट दिया। 100 परिणाम हैं। requests.__version__ == '0.10.6'

+0

गाह मैं बस इस सटीक उदाहरण को टाइप कर रहा था। मुझे संदेह है कि ओपी पाइथन ऑब्जेक्ट को क्रमबद्ध करने के लिए जेसन मॉड्यूल का उपयोग कर रहा था। वह शायद एक जेसन स्ट्रिंग से मैन्युअल रूप से बचने की कोशिश कर रहा था। – jdi

+0

हां, यह समझ में आता है। शायद यही कारण है कि यह सही ढंग से पार्सिंग नहीं कर रहा था – jterrace

संबंधित मुद्दे