2009-11-08 35 views

Trả lời

282

Từ docs:

urllib.quote(string[, safe]) 

Thay thế ký tự đặc biệt trong chuỗi sử dụng thoát% xx. Chữ cái, chữ số, và các ký tự '_.-' không bao giờ là được trích dẫn. Theo mặc định, chức năng này là dành cho trích dẫn phần đường của URL.The tùy chọn tham số an toàn xác định ký tự bổ sung mà không nên được trích dẫn - giá trị mặc định của nó là '/'

Đó có nghĩa là vượt qua '' cho an toàn sẽ giải quyết vấn đề đầu tiên của bạn:

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

Về vấn đề thứ hai, có báo cáo lỗi về số here. Rõ ràng nó đã được cố định trong python 3. Bạn có thể workaround nó bằng cách mã hóa như là utf8 như thế này:

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

Bằng cách này có một cái nhìn tại urlencode

Lưu ý rằng urllib.quote chuyển đến urllib.parse.quote trong Python3

+0

Cảm ơn bạn, cả hai đều làm việc rất lớn. urlencode chỉ gọi quoteplus nhiều lần trong một vòng lặp, đó không phải là chuẩn hóa chính xác cho tác vụ của tôi (oauth). –

+4

thông số kỹ thuật: [rfc 2396] (https://www.ietf.org/rfc/rfc2396.txt) xác định những thông tin này là đã đặt trước 'reserved ="; " | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 'Đó là những gì urllib.quote đang xử lý. –

+25

'urllib.quote' được chuyển đến' urlib.parse.quote', kể từ Python3. – Hibou57

107

Trong Python 3, urllib.quote đã được chuyển đến urllib.parse.quote và nó xử lý unicode theo mặc định.

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

Câu trả lời của tôi tương tự như câu trả lời của Paolo.

Tôi nghĩ rằng mô-đun requests là tốt hơn nhiều. Nó dựa trên urllib3. Bạn có thể thử này:

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

' requests.utils.quote' là liên kết đến python 'quote '. Xem [nguồn yêu cầu] (https: // github.com/kennethreitz/requests/blob/master/requests/compat.py # L36). – Cjkjvfnby

+8

'requests.utils.quote' là một trình bao bọc tương thích mỏng với' urllib.quote' cho python 2 và 'urllib.parse.quote' cho python 3 –

8

Nếu bạn đang sử dụng django, bạn có thể sử dụng urlquote:

>>> from django.utils.http import urlquote 
>>> urlquote(u"Müller") 
u'M%C3%BCller' 
Các vấn đề liên quan