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.