Python'da URL parametrelerini yüzde olarak nasıl kodlayabilirim?


299

Eğer yaparsam

url = "http://example.com?p=" + urllib.quote(query)
  1. Bu kodlamak değil /için %2F(breaks OAuth normalleştirme)
  2. Unicode ile başa çıkmaz (bir istisna atar)

Daha iyi bir kütüphane var mı?


1
Bunlar URL parametreleri değil, FYI. Açıklığa kavuşturmalısın.
Jamie Marshall

Yanıtlar:


391

Python 2

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

Python 3

Aynı, yerine urllib.quoteile değiştirin urllib.parse.quote.


1
Teşekkürler, ikisi de harika çalıştı. urlencode sadece bir döngüde birçok kez quoteplus'ı çağırır, bu benim görevim için doğru normalleştirme değildir (oauth).
Paul Tarjan

6
spec: rfc 2396 bunları ayrılmış olarak tanımlar reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","urllib.quote ile ilgilenen nedir.
Jeff Sheffield

63
urllib.quotetaşındı urlib.parse.quotePython3 beri.
Hibou57

5
urllib.parse.quote dokümanlar
Andreas Haferburg

Ayrıca, bir arama sorgusunun kodlanması durumunda, quote_plus: docs.python.org/3/library/… 1 kullanarak daha iyi durumda olabilirsiniz . Varsayılan olarak 2 eğik çizgileri kodlar. Ayrıca boşlukları kodlar
Pavel Vergeev

174

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/'

2
Bu isim quoteküresel olarak oldukça belirsiz. Urlencode: gibi bir şey kullanmak daha hoş olabilir from urllib.parse import quote as urlencode.
Luc

Not adında bir fonksiyon olduğunu 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.
jaymmer - Monica'yı eski durumuna döndür

48

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'

5
requests.utils.quotePython'a bağlantıdır quote. Talep kaynaklarına bakın .
Cjkjvfnby

16
requests.utils.quoteurllib.quotepython 2 ve urllib.parse.quotepython 3 için ince bir uyumluluk sargısıdır
Jeff Sheffield

13

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)

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

Dokümanlar

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.