我在逐行复制教程时遇到了这个错误。这是:
endpoint = 'https:///maps.googleapi.com/maps/api/directions/json?'
origin = ('London').replace(' ', '+')
destination = ('Heathrow').replace(' ', '+')
nav_request = 'origin={} &destination={} &key={}' .format(origin,destination,googleDir_key)
request = endpoint + nav_request
response = urllib.request.urlopen(request).read()
directions = json.loads(response)
print(directions)
答案 0 :(得分:0)
您的网址没有主机名。 Scheme,冒号,两个斜杠,主机名,斜杠,路径,可选问号和查询字符串,可选哈希和片段。你有三个连续的斜杠。
答案 1 :(得分:0)
我认为您应该使用requests
库,但您的问题似乎在于字符串格式。例如:
origin = ('London').replace(' ', '+')
+
中的'London'
无法替换空格。 '('Heathrow').replace(' ', '+')'
也是如此。然后你在nav_request = 'origin={} &destination={} &key={}'
中引入空格,但为时已晚。 London'.replace(' ', '+')
仍为'origin=London '
。
可能如下:
nav_request = 'origin={}+&destination={}+&key={}'.format(origin,destination,googleDir_key)
答案 2 :(得分:0)
有几件事:
1-' https:'后面有三个斜杠。这是您访问文件的方式(即file:///blah.txt),但它对HTTP无效。虽然浏览器会更正此问题,但它无法使用urllib或请求。
2-您按照定义navrequest的方式拥有未转义的空格。我建议你在内置的navrequest而不是每个组件上进行替换,因此它只进行一次(更容易阅读)。
PS - 正如其他人所说的那样,我建议使用请求模块(或者如果你想异步操作则使用grequests)。
答案 3 :(得分:0)
因为你在https之后放了一个额外的/所以urllib无法检测到主机名。 在您的情况下,请考虑以下代码示例:
from urllib.parse import urlparse
endpoint = 'https:///maps.googleapi.com/maps/api/directions/json'
endpoint = urlparse(endpoint)
print(endpoint.netloc)
print(endpoint)
输出将是:
''
ParseResult(scheme='https', netloc='', path='/maps.googleapi.com/maps/api/directions/json', params='', query='', fragment='')
现在删除额外/后https:您的端点变量将被修改。现在再次运行上一个代码:
from urllib.parse import urlparse
endpoint = 'https://maps.googleapi.com/maps/api/directions/json'
endpoint = urlparse(endpoint)
print(endpoint.netloc)
print(endpoint)
输出将是:
maps.googleapi.com
ParseResult(scheme='https', netloc='maps.googleapi.com', path='/maps/api/directions/json', params='', query='', fragment='')
现在你看到了差异