无法在 Python 上解析非 ASCII URL?

Unable to parse Non ASCII URL on Python?

我想查询 Freebase API 以获取 José Mourinho 效力过的球队列表。

所以,我在浏览器上使用的URL是

https://www.googleapis.com/freebase/v1/mqlread?query=[{"name": "José Mourinho","/sports/pro_athlete/teams": [{"mid": null,"team": null,"to": null,"optional": true}]}]

然而,

import json
import urllib

service_url="https://www.googleapis.com/freebase/v1/mqlread"
query = '[{"name": "' + "José Mourinho" + '","/sports/pro_athlete/teams": [{"mid": null,"team": null,"to": null,"optional": true}]}]'
url = service_url + '?' + 'query='+query
response = json.loads(urllib.urlopen(url).read())

给我一个错误说,

UnicodeError: URL u'https://www.googleapis.com/freebase/v1/mqlread?query=[{"name": "Jos\xe9 Mourinho","/sports/pro_athlete/teams": [{"mid": null,"team": null,"to": null,"optional": true}]}]' contains non-ASCII characters

解决这个问题的方法是什么?

我认为您跳过了一点 the docs。试试这个:

# coding=UTF-8

import json
import urllib

service_url = "https://www.googleapis.com/freebase/v1/mqlread"
query = [{
    '/sports/pro_athlete/teams': [
        {
            'to': None,
            'optional': True,
            'mid': None,
            'team': None
        }
    ],
    'name': 'José Mourinho'
}]

url = service_url + '?' + urllib.urlencode({'query': json.dumps(query)})
response = json.loads(urllib.urlopen(url).read())

print response

与其自己构建查询字符串,不如使用 json.dumpsurllib.urlencode 为您创建。他们擅长这个。

注意:如果您可以使用 requests 包,那么最后一点可以是:

import requests
response = requests.get(service_url, params={'query': json.dumps(query)})

然后你就可以跳过 URL 构造并完全转义!