如果我这样做
url = "http://example.com?p=" + urllib.quote(query)
它不编码/到%2F(破坏OAuth规范化) 它不处理Unicode(它抛出异常)
有更好的图书馆吗?
如果我这样做
url = "http://example.com?p=" + urllib.quote(query)
它不编码/到%2F(破坏OAuth规范化) 它不处理Unicode(它抛出异常)
有更好的图书馆吗?
当前回答
我认为模块请求要好得多。它基于urllib3。
你可以试试这个:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
我的答案和Paolo的答案相似。
其他回答
使用furl的另一种方法:
import furl
url = "https://httpbin.org/get?hello,world"
print(url)
url = furl.furl(url).url
print(url)
输出:
https://httpbin.org/get?hello,world
https://httpbin.org/get?hello%2Cworld
这里最好使用urlencode。单个参数没有太大区别,但是,恕我直言,它使代码更清晰。(看到函数quote_plus!-尤其是那些来自其他语言的人。)
In [21]: query='lskdfj/sdfkjdf/ksdfj skfj'
In [22]: val=34
In [23]: from urllib.parse import urlencode
In [24]: encoded = urlencode(dict(p=query,val=val))
In [25]: print(f"http://example.com?{encoded}")
http://example.com?p=lskdfj%2Fsdfkjdf%2Fksdfj+skfj&val=34
文档
urlencode quote_plus
如果你正在使用Django,你可以使用urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
注意,对Python的更改意味着它现在是一个遗留包装器。Django .utils.http的Django 2.1源代码:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
我认为模块请求要好得多。它基于urllib3。
你可以试试这个:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
我的答案和Paolo的答案相似。
在Python 3中,urllib。Quote已移动到urllib.parse。它默认情况下处理Unicode。
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'