【问题标题】:How to URL encode in Python 3?如何在 Python 3 中进行 URL 编码?
【发布时间】:2016-11-11 23:09:21
【问题描述】:

我尝试关注the documentation,但无法在Python 3 中使用urlparse.parse.quote_plus()

from urllib.parse import urlparse

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

我明白了

AttributeError: 'function' 对象没有属性 'parse'

【问题讨论】:

    标签: python urlencode


    【解决方案1】:

    您误读了文档。你需要做两件事:

    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'
    

    【讨论】:

    • 很遗憾它不适用于像 PHP 的函数 urlencode() 这样的纯字符串。所以必须有键:值对,恕我直言,这太严格了。例如,我需要在proto://user:pass@site.com cmd 行中仅对字符串的一部分进行 URL 编码以运行重复备份。 Python2 确实按预期工作:python2 -c "import urllib as ul; print ul.quote_plus('$KEY');" -> 其中$KEY 由 bash 脚本提供。
    • @stamster quote_plus 在 Python 3 中以同样的方式可用。 python3 -c "import urllib.parse as ul; print(ul.quote_plus('$KEY'))"
    【解决方案2】:

    对于 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'
    

    【讨论】:

    • 这不是 Python 3 代码。不幸的是,python3 中的 urllib 中没有引号了。
    • 试试 urllib.parse.quote [编辑原帖] @NiallFarrington
    • from requests.utils import requote_uri 在 Python 3.6 上工作
    • print(urllib.parse.quote("http://www.sample.com/")) 打印 http%3A//www.sample.com/
    • @AliKaraca 如果您还想对斜杠 (/) 进行 URL 编码,则必须将 safe="" 作为第二个参数传递给 quote 函数。像这样:urllib.parse.quote("http://www.sample.com/", safe="")
    【解决方案3】:

    您正在寻找urllib.parse.urlencode

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

    【讨论】:

    • 这不适用于 usernamepassword in http://username:password@www.site.com/
    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2013-04-02
    • 2011-08-30
    • 2018-09-09
    相关资源
    最近更新 更多