Python, hàm đối lập urllib.urlencode


88

Làm cách nào để chuyển đổi dữ liệu sau khi xử lý urllib.urlencodethành dict? urllib.urldecodekhông tồn tại.

Câu trả lời:


124

Như các tài liệu cho urlencodetiếng nói,

Mô-đun urlparse cung cấp các hàm parse_qs () và parse_qsl () được sử dụng để phân tích cú pháp các chuỗi truy vấn thành cấu trúc dữ liệu Python.

(Trong các bản phát hành Python cũ hơn, chúng nằm trong cgimô-đun). Ví dụ:

>>> import urllib
>>> import urlparse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urlparse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

Sự khác biệt rõ ràng giữa từ điển gốc dvà từ điển "bị vấp" d1là từ điển sau có (một mục, trong trường hợp này) được liệt kê dưới dạng giá trị - đó là bởi vì không có đảm bảo tính duy nhất trong chuỗi truy vấn và nó có thể quan trọng cho ứng dụng của bạn để biết về nhiều giá trị đã được cung cấp cho mỗi khóa (nghĩa là, các danh sách không phải lúc nào cũng là một mục duy nhất ;-).

Như một sự thay thế:

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

bạn có thể nhận được một chuỗi các cặp (urlencode cũng chấp nhận một đối số như vậy - trong trường hợp này nó bảo toàn thứ tự, trong khi trong trường hợp dict thì không có thứ tự nào để bảo toàn ;-). Nếu bạn biết không có "khóa" trùng lặp nào, hoặc không quan tâm nếu có, thì (như tôi đã trình bày), bạn có thể gọi dictđể lấy từ điển với các giá trị không thuộc danh sách. Nói chung, tuy nhiên, bạn làm cần phải xem xét những gì bạn muốn làm gì nếu bản sao hiện tại (Python không quyết định rằng thay cho bạn ;-).


1
Câu trả lời rất tường tận. Tuyệt vời!
Hartley Brody

Bỏ phiếu cho Python 2, tuy nhiên Python 3 đều nằm trong urllibmô-đun. Xem câu trả lời của @phobie.
openwonk

18

Mã Python 3 cho giải pháp của Alex:

>>> import urllib.parse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.parse.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urllib.parse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

Thay thế:

>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

parse_qsl có thể hoàn nguyên:

>>> urllib.parse.urlencode(sq)
'a=b&c=d'

16

urllib.unquote_plus()làm những gì bạn muốn. Nó thay thế% xx thoát bằng ký tự tương đương của chúng và thay thế dấu cộng bằng dấu cách.

Thí dụ:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

hoa lợi

'/~candidates/?name=john connolly'.

2
Anh ấy nói, anh ấy muốn có một khẩu lệnh. Vậy câu trả lời của bạn là sai.
balrok

4
vâng, đây là những gì tôi đang tìm kiếm.
Joe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.