2012-01-18 37 views
20

Có phương pháp đơn giản nào tôi bị thiếu trong urllib hoặc thư viện khác cho tác vụ này không? Mã hóa URL thay thế các ký tự ASCII không an toàn bằng "%" theo sau là hai chữ số thập lục phân.Mã hóa URL trong python

Dưới đây là một ví dụ về một đầu vào và đầu ra dự kiến ​​của tôi:

Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Galaxy Nexus Build/IFL10C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 

Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0%3B+xx-xx%3B+Galaxy+Nexus+Build%2FIFL10C%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Mobile+Safari%2F534.30 

Trả lời

41

Đối với Python 2.x, sử dụng urllib.quote

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

dụ:

In [1]: import urllib 

In [2]: urllib.quote('%') 
Out[2]: '%25' 

EDIT:

Trong trường hợp của bạn, để thay thế không gian bằng dấu cộng, bạn có thể sử dụng urllib.quote_plus

dụ:

In [4]: urllib.quote_plus('a b') 
Out[4]: 'a+b' 

Đối với Python 3.x, sử dụng quote

>>> import urllib 
>>> a = "asdas#@das" 
>>> urllib.parse.quote(a) 
'asdas%23%40das' 

và cho chuỗi với việc sử dụng không gian 'quote_plus'

>>> import urllib 
>>> a = "as da& s#@das" 
>>> urllib.parse.quote_plus(a) 
'as+da%26+s%23%40das' 
+0

hoặc [urllib.quote_plus] (http://docs.python.org/library/urllib.html#urllib.quote_plus), vì OP muốn '+' thay vì '% 20'. – Avaris

+2

nhưng để có được những gì OP yêu cầu, hãy sử dụng 'urllib.quote_plus'. –

1

Ngoài ra, nếu bạn có một dict của nhiều giá trị, cách tốt nhất để làm điều đó sẽ là urllib.urlencode.

2

Hãy ghi nhớ rằng cả hai urllib.quoteurllib.quote_plus ném ra một lỗi nếu một đầu vào là một chuỗi unicode:

s = u'\u2013' 
urllib.quote(s) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\urllib.py", line 1303, in quote 
    return ''.join(map(quoter, s)) 
KeyError: u'\u2013' 

Như đã trả lời here on SO, người ta phải sử dụng 'UTF-8' một cách rõ ràng:

urllib.quote(s.encode('utf-8'))