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

Python 如何从完整URL创建百分比编码URL?,python,python-3.x,urllib,Python,Python 3.x,Urllib,输入url是ascii码和多字节码的混合。 我不能改变这个字符串。 我想下载此url,但发生错误,序号不在范围(128) 首先,我尝试了urllib.parse.quote(),但结果是http%3a%2f%2fsample%2ejp%2fapi%3fv1%3daaa%26v2%3d%93%fa%96%7b%8c%ea%26v3%3dccc。我有另一个错误ValueError:未知url类型。 我如何解决这个问题?或者您有什么想法吗?您需要将这些参数编码为UTF-8字节和toURL百分比编码的字

输入url是ascii码和多字节码的混合。 我不能改变这个字符串。 我想下载此url,但发生错误,序号不在范围(128)

首先,我尝试了
urllib.parse.quote()
,但结果是
http%3a%2f%2fsample%2ejp%2fapi%3fv1%3daaa%26v2%3d%93%fa%96%7b%8c%ea%26v3%3dccc
。我有另一个错误
ValueError:未知url类型

我如何解决这个问题?或者您有什么想法吗?

您需要将这些参数编码为UTF-8字节和toURL百分比编码的字节。您可以使用以下工具完成所有这些操作:

演示:

>>从urllib.parse导入urlparse,parse_qs,urlencode
>>>输入url=”http://sample.jp/api?v1=aaa&v2=日本語&v3=ccc“
>>>parsed=urlparse(输入\ url)
>>>query=parse_qs(parsed.query)
>>>已解析。_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'
>>>导入urllib.request
>>>urllib.request.urlopen(\ux)

您需要将这些参数编码为UTF-8字节和toURL百分比编码的字节。您可以使用以下工具完成所有这些操作:

演示:

>>从urllib.parse导入urlparse,parse_qs,urlencode
>>>输入url=”http://sample.jp/api?v1=aaa&v2=日本語&v3=ccc“
>>>parsed=urlparse(输入\ url)
>>>query=parse_qs(parsed.query)
>>>已解析。_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'
>>>导入urllib.request
>>>urllib.request.urlopen(\ux)

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'

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'

>>urllib.unquote('v1=%5B%27aaa%27%5D')“v1=['aaa']”“
非常感谢您的建议和演示。我试过了,但得到了
http://sample.jp/api?v2=['日本語']&v3=['ccc']&v1=['aaa']
。但是我知道我必须编码到UTF-8,我可以使用URLPrase,parseqs,urlencode。非常感谢你的帮助。@MaikoOhkawa:mea culpa,需要设置doseq标志。哦,对不起!我误解了。我忘了设置doseq标志。当我添加
doseq=True
时,它可以完全正常工作。我明白了。当doseq为True时,我会获取序列字符串。我学到了。非常感谢您的建议!
>>urllib.unquote('v1=%5B%27aaa%27%5D')“v1=['aaa']”“
非常感谢您的建议和演示。我尝试了,但我得到了
http://sample.jp/api?v2=['日本語']&v3=['ccc']&v1=['aaa']
。但是我知道我必须编码到UTF-8,我可以使用URLPrase,parseqs,urlencode。非常感谢你的帮助。@MaikoOhkawa:mea culpa,需要设置doseq标志。哦,对不起!我误解了。我忘了设置doseq标志。当我添加
doseq=True
时,它可以完全正常工作。我明白了。当doseq为True时,我会获取序列字符串。我学到了。非常感谢您的建议!谢谢。它在Python3上运行良好。
从urllib.parse导入urlparse,parse_qsl,urlencode urlencode(parse_qsl(urlparse(input_url.query))
Genious!非常感谢您的帮助。谢谢。它在Python3上运行良好。
从urllib.parse导入urlparse,parse_qsl,urlcode urlcode(parse_qsl(urlparse(input_url.query))
Genious!非常感谢您的帮助。
>>> 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>
>>> urllib.urlencode(urlparse.parse_qsl(urlparse.urlparse(input_url).query))
'v1=aaa&v2=%E6%97%A5%E6%9C%AC%E8%AA%9E&v3=ccc'