urlib错误:&#34; urllib.error.URLError:<urlopen error =“”no =“”host =“”given =“”>&#34;

时间:2018-02-27 22:53:36

标签: python url

我在逐行复制教程时遇到了这个错误。这是:

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)

4 个答案:

答案 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-&#39; https:&#39;后面有三个斜杠。这是您访问文件的方式(即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='')

现在你看到了差异