Eğer yaparsam
url = "http://example.com?p=" + urllib.quote(query)
- Bu kodlamak değil
/
için%2F
(breaks OAuth normalleştirme) - Unicode ile başa çıkmaz (bir istisna atar)
Daha iyi bir kütüphane var mı?
Eğer yaparsam
url = "http://example.com?p=" + urllib.quote(query)
/
için %2F
(breaks OAuth normalleştirme)Daha iyi bir kütüphane var mı?
Yanıtlar:
Gönderen docs :
urllib.quote(string[, safe])
% Xx kaçışını kullanarak dizedeki özel karakterleri değiştirin. Harfler, rakamlar ve '_.-' karakterleri asla tırnak içine alınmaz. Varsayılan olarak, bu işlev URL'nin yol bölümünü alıntılamak için tasarlanmıştır. İsteğe bağlı safe parametresi tırnak içine alınmaması gereken ek karakterleri belirtir - varsayılan değeri '/'
Bu, `` güvenli için geçmek '' ilk sorununuzu çözecektir:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
İkinci sayı hakkında, burada bir hata raporu var . Görünüşe göre python 3'te düzeltildi. Aşağıdaki gibi utf8 olarak kodlayarak geçici olarak çözebilirsiniz:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Bu arada urlencode'a bir göz atın
Aynı, yerine urllib.quote
ile değiştirin urllib.parse.quote
.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
urllib.quote ile ilgilenen nedir.
urllib.quote
taşındı urlib.parse.quote
Python3 beri.
urllib.parse.quote
dokümanlar
Python 3'te, urllib.quote
taşındı urllib.parse.quote
ve varsayılan olarak unicode işlemektedir.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
quote
küresel olarak oldukça belirsiz. Urlencode: gibi bir şey kullanmak daha hoş olabilir from urllib.parse import quote as urlencode
.
urlencode
içinde urllib.parse
başka bir isim seçmek veya risk ciddiye kod gelecek okuyucuların kafa karıştırıcı daha iyi olacağını, böylece tamamen farklı bir şey yapar zaten.
Cevabım Paolo'nun cevabına benziyor.
Bence modül requests
çok daha iyi. Dayanmaktadır urllib3
. Bunu deneyebilirsiniz:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quote
urllib.quote
python 2 ve urllib.parse.quote
python 3 için ince bir uyumluluk sargısıdır
Django kullanıyorsanız urlquote'u kullanabilirsiniz:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
Bu yanıtın yayınlanmasından bu yana Python'da yapılan değişikliklerin, bunun artık eski bir paket olduğu anlamına geldiğini unutmayın. Django.utils.http için Django 2.1 kaynak kodundan:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Burada kullanmak daha iyidir urlencode
. Tek parametre için fazla bir fark yok, ancak IMHO kodu daha net hale getiriyor. (Bir işlevi görmek kafa karıştırıcı görünüyor quote_plus
! Özellikle diğer dillerden gelenler)
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