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.quoteile değiştirin urllib.parse.quote.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","urllib.quote ile ilgilenen nedir.
urllib.quotetaşındı urlib.parse.quotePython3 beri.
urllib.parse.quote dokümanlar
Python 3'te, urllib.quotetaşındı urllib.parse.quoteve 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/'
quoteküresel olarak oldukça belirsiz. Urlencode: gibi bir şey kullanmak daha hoş olabilir from urllib.parse import quote as urlencode.
urlencodeiçinde urllib.parsebaş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.quoteurllib.quotepython 2 ve urllib.parse.quotepython 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