Jika aku melakukan
url = "http://example.com?p=" + urllib.quote(query)
- Itu tidak encode
/
ke%2F
(istirahat OAuth normalisasi) - Itu tidak menangani Unicode (ini melempar pengecualian)
Apakah ada perpustakaan yang lebih baik?
Jika aku melakukan
url = "http://example.com?p=" + urllib.quote(query)
/
ke %2F
(istirahat OAuth normalisasi)Apakah ada perpustakaan yang lebih baik?
Jawaban:
Dari dokumen :
urllib.quote(string[, safe])
Ganti karakter khusus dalam string menggunakan% xx escape. Huruf, angka, dan karakter '_.-' tidak pernah dikutip. Secara default, fungsi ini dimaksudkan untuk mengutip bagian jalur URL. Parameter aman opsional menentukan karakter tambahan yang tidak boleh dikutip - nilai defaultnya adalah '/'
Itu berarti melewati '' untuk aman akan menyelesaikan masalah pertama Anda:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
Tentang masalah kedua, ada laporan bug di sini . Rupanya itu diperbaiki dalam python 3. Anda dapat mengatasinya dengan pengkodean sebagai utf8 seperti ini:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Omong-omong lihat urlencode
Sama, kecuali ganti urllib.quote
dengan urllib.parse.quote
.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Inilah yang berurusan dengan urllib.quote.
urllib.quote
dipindahkan ke urlib.parse.quote
, sejak Python3.
urllib.parse.quote
docs
Dalam Python 3, urllib.quote
telah dipindahkan ke urllib.parse.quote
dan menangani unicode secara default.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
quote
itu agak kabur sebagai global. Mungkin lebih baik untuk menggunakan sesuatu seperti urlencode: from urllib.parse import quote as urlencode
.
urlencode
di dalam urllib.parse
yang melakukan sesuatu yang sama sekali berbeda, jadi sebaiknya Anda memilih nama lain atau berisiko serius membingungkan pembaca kode Anda di masa mendatang.
Jawaban saya mirip dengan jawaban Paolo.
Saya pikir modul requests
jauh lebih baik. Ini berdasarkan urllib3
. Anda dapat mencoba ini:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quote
adalah pembungkus kompatibilitas tipis untuk urllib.quote
untuk python 2 dan urllib.parse.quote
untuk python 3
Jika Anda menggunakan Django, Anda dapat menggunakan urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
Perhatikan bahwa perubahan pada Python sejak jawaban ini dipublikasikan berarti bahwa ini sekarang adalah pembungkus warisan. Dari kode sumber Django 2.1 untuk django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Lebih baik digunakan di urlencode
sini. Tidak banyak perbedaan untuk parameter tunggal tetapi IMHO membuat kode lebih jelas. (Sepertinya membingungkan melihat fungsi quote_plus
! Terutama yang berasal dari negara lain)
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: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
quote_plus: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus