2012-05-08 38 views
5

Vì vậy, tôi muốn sử dụng tuyệt đối của Kenneth requests module. Đã giải quyết vấn đề này trong khi cố gắng sử dụng Freebase API.Chuyển đối tượng JSON tới url có yêu cầu

Về cơ bản, API của họ trông như thế:

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

như một truy vấn, họ mong đợi một đối tượng JSON, đây cũng là loại sẽ 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" 
}]​ 

Tất nhiên, chúng tôi sẽ phải thoát khỏi địa ngục này trước khi chuyển nó đến một URL, vì vậy truy vấn thực tế sẽ như sau:

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' 

Bây giờ,

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

vì trang web tuyên bố không thể phân tích truy vấn.

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

Không có vấn đề ở đây, tôi nhận được sự trở lại thích hợp. Thật thú vị,

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

Tại sao? Tôi có sử dụng mô-đun sai không? Hay là một lỗi trong số requests?

+0

Sử dụng mô-đun 'json', nếu bạn chưa sẵn sàng. – jdi

Trả lời

6

Nó phù hợp với tôi. Đây là những gì tôi đã làm:

>>> 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'}, 
.... 

Tôi cắt phần còn lại cho ngắn gọn. Có 100 kết quả. requests.__version__ == '0.10.6'

+0

Gah Tôi đã chỉ cần gõ chính xác ví dụ này. Tôi nghi ngờ OP đã sử dụng mô-đun json để sắp xếp từng đối tượng python. Có lẽ anh ta đang cố gắng thoát khỏi một chuỗi json bằng tay. – jdi

+0

Vâng, điều đó có ý nghĩa. Đó có thể là lý do tại sao nó không phân tích cú pháp chính xác – jterrace

Các vấn đề liên quan