如何在Python 3中进行URL编码?

96
我尝试按照文档进行操作,但无法在Python 3中使用urlparse.parse.quote_plus()函数。
from urllib.parse import urlparse

params = urlparse.parse.quote_plus({'username': 'administrator', 'password': 'xyz'})

我遇到了一个错误。错误信息是:'function'对象没有属性'parse'。
3个回答

136

你误读了文档,需要做两件事情:

  1. 从你的字典中引用每个键和值,并且
  2. 将它们编码成URL

幸运的是,urllib.parse.urlencode可以在一步中完成这两件事情,这就是你应该使用的函数。

from urllib.parse import urlencode, quote_plus

payload = {'username':'administrator', 'password':'xyz'}
result = urlencode(payload, quote_via=quote_plus)
# 'password=xyz&username=administrator'

2
很遗憾,它不能像PHP的函数urlencode()一样使用普通字符串。因此,必须有键值对,这在我看来太过限制了。例如,我需要仅对字符串的一部分进行URL编码 - 在proto://user:pass@site.com命令行中的密码以运行duplicity备份。但是Python2确实按预期工作:python2 -c "import urllib as ul; print ul.quote_plus('$KEY');" ->其中$KEY由bash脚本提供。 - stamster
10
“quote_plus” 在 Python 3 中同样可用。使用以下命令: python3 -c "import urllib.parse as ul; print(ul.quote_plus('$KEY'))",其中 $KEY 是需要进行 URL 编码的字符串。 - Adam Smith

101

对于Python 3,您可以尝试使用quote而不是quote_plus

import urllib.parse

print(urllib.parse.quote("http://www.sample.com/", safe=""))

结果:

http%3A%2F%2Fwww.sample.com%2F

或者:

from requests.utils import requote_uri
requote_uri("http://www.sample.com/?id=123 abc")

结果:

'https://www.sample.com/?id=123%20abc'

3
这不是Python 3的代码。不幸的是,在Python 3中,urllib中不再有引号。 - Niall Farrington
2
尝试使用urllib.parse.quote函数。 - Rich Rajah
2
从 requests.utils 导入 requote_uri 在 Python 3.6 上工作。 - Evgeny Nozdrev
如果使用Python3,则print()需要括号。 - Loïc
11
print(urllib.parse.quote("http://www.sample.com/"))会输出http%3A//www.sample.com/ - Ali Karaca
3
如果你想将斜杠(/)进行URL编码,你需要在quote函数的第二个参数中传入safe=""。例如: urllib.parse.quote("http://www.sample.com/", safe="") - miu

17

您正在寻找urllib.parse.urlencode

import urllib.parse

params = {'username': 'administrator', 'password': 'xyz'}
encoded = urllib.parse.urlencode(params)
# Returns: 'username=administrator&password=xyz'

这对于 http://username:password@www.site.com/ 中的 usernamepassword 无效。 - Gert van den Berg
你的示例使用了路径参数,而不是查询参数。对于查询参数,你需要: from urllib.parse import quote resource_path = "http://{username}:{password}@www.site.com/" path_params = dict(username='你好', password='你好') for k, v in path_params.items(): # 指定安全字符,编码所有内容 resource_path = resource_path.replace( '{%s}' % k, quote(str(v)) ) - spacether

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接