2009-11-08 19 views

Odpowiedz

282

Z docs:

urllib.quote(string[, safe]) 

Wymień znaków specjalnych w ciąg pomocą ucieczkę% xx. Litery, cyfry, i znaki "_.-" nigdy nie są cytowane pod numerem . Domyślnie ta funkcja jest przeznaczona dla cytując odcinek ścieżki z URL.The opcjonalnym bezpiecznej parametru określa dodatkowe znaki, które nie powinny być cytowane - jego wartość domyślna jest „/”

Że oznacza przejściu „” dla bezpiecznego rozwiąże pierwszy problem:

>>> urllib.quote('/test') 
'/test' 
>>> urllib.quote('/test', safe='') 
'%2Ftest' 

o drugiej kwestii, istnieje raport o błędzie o tym here. Najwyraźniej zostało to naprawione w Pythonie 3. Można obejść go jako kodowanie utf8 jak ten:

>>> query = urllib.quote(u"Müller".encode('utf8')) 
>>> print urllib.unquote(query).decode('utf8') 
Müller 

Przy okazji rzucić okiem na urlencode

Zauważ, że urllib.quote przeniesiona do urllib.parse.quote w Python3

+0

dziękuje, zarówno działał świetnie. urlencode po prostu wywołuje quoteplus wiele razy w pętli, co nie jest prawidłową normalizacją dla mojego zadania (oauth). –

+4

Spec: [rfc 2396] (https://www.ietf.org/rfc/rfc2396.txt) definiuje je jako zastrzeżone 'zarezerwowane ="; " | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," "Z czym właśnie się zajmuje urllib.quote. –

+25

'urllib.quote' przeniesiony do' urlib.parse.quote', od Python3. – Hibou57

107

W języku Python 3, urllib.quote został przeniesiony do urllib.parse.quote i domyślnie obsługuje standard Unicode.

>>> from urllib.parse import quote 
>>> quote('/test') 
'/test' 
>>> quote('/test', safe='') 
'%2Ftest' 
>>> quote('/El Niño/') 
'/El%20Ni%C3%B1o/' 
29

Moja odpowiedź jest podobna do odpowiedzi Paola.

Myślę, że moduł requests jest znacznie lepszy. Opiera się na urllib3. Można spróbować to:

>>> from requests.utils import quote 
>>> quote('/test') 
'/test' 
>>> quote('/test', safe='') 
'%2Ftest' 
+2

' requests.utils.quote' jest linkiem do pythona 'quote '. Zobacz [request sources] (https: // github.com/kennethreitz/requests/blob/master/requests/compat.py # L36). – Cjkjvfnby

+8

'requests.utils.quote' jest cienkim opakowaniem kompatybilności z' urllib.quote' dla python 2 i 'urllib.parse.quote' dla python 3 –

8

Jeśli używasz Django, można użyć urlquote:

>>> from django.utils.http import urlquote 
>>> urlquote(u"Müller") 
u'M%C3%BCller' 
Powiązane problemy