6

So, I want to use Kenneth' excellent requests module. Stumbled up this problem while trying to use the Freebase API.

Basically, their API looks like that:

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

as a query, they expect a JSON object, here's one that will 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"
}]​

Of course, we'll have to escape the hell out of this before passing it to an URL, so the actual query will look like this:

 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'

Now,

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

because the site claims it couldn't parse the query.

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

No problem here, I get a proper return. Interestingly,

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

Why? Am I using the module wrong? Or is it a bug in requests?

1
  • Use the json module, if you aren't already. Commented May 8, 2012 at 17:42

1 Answer 1

8

It works for me. Here's what I did:

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

I cut the rest off for brevity. There are 100 results. requests.__version__ == '0.10.6'

Sign up to request clarification or add additional context in comments.

2 Comments

Gah I was just typing out this exact example. I doubt the OP was using the json module to serialize the python object. He was probably trying to manually escape a json string.
Yes, that would make sense. It's probably why it wasn't parsing correctly

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.