如何从完整的URL创建百分比编码的URL?

时间:2016-03-15 11:48:31

标签: python python-3.x urllib

输入url是ascii和多字节代码。 我无法改变这些字符串。 我想下载此网址,但发生错误ordinal not in range(128)

input_url = "http://sample.jp/api?v1=aaa&v2=日本語&v3=ccc"

req = urllib.request.Request(input_url)
resp = None
try:
    resp = urllib.request.urlopen(req)
except UnicodeEncodeError as e:
    print(e.reason)  # I had an error `ordinal not in range(128)`
return resp

首先,我尝试urllib.parse.quote()但结果是http%3a%2f%2fsample%2ejp%2fapi%3fv1%3daaa%26v2%3d%93%fa%96%7b%8c%ea%26v3%3dccc。我有另一个错误ValueError: unknown url type。 我该如何解决这个问题?或者你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您需要将这些参数编码为UTF-8字节,将字节编码为URL百分比编码。您可以使用urllib.parse module

完成所有这些操作
from urllib.parse import urlparse, parse_qs, urlencode

parsed = urlparse(input_url)
query = parse_qs(parsed.query)
fixed_url = parsed._replace(query=urlencode(query, doseq=True)).geturl()

演示:

>>> from urllib.parse import urlparse, parse_qs, urlencode
>>> input_url = "http://sample.jp/api?v1=aaa&v2=日本語&v3=ccc"
>>> parsed = urlparse(input_url)
>>> query = parse_qs(parsed.query)
>>> parsed._replace(query=urlencode(query, doseq=True)).geturl()
'http://sample.jp/api?v1=aaa&v2=%E6%97%A5%E6%9C%AC%E8%AA%9E&v3=ccc'
>>> import urllib.request
>>> urllib.request.urlopen(_)
<http.client.HTTPResponse object at 0x108f0f7b8>

答案 1 :(得分:1)

urllib和urlparse的组合应该为你做到:

>>> urllib.urlencode(urlparse.parse_qsl(urlparse.urlparse(input_url).query))
'v1=aaa&v2=%E6%97%A5%E6%9C%AC%E8%AA%9E&v3=ccc'