Câu trả lời:
Như các tài liệu cho urlencode
tiế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 cgi
mô-đ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 d
và từ điển "bị vấp" d1
là 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 là hiện tại (Python không quyết định rằng thay cho bạn ;-).
urllib
mô-đun. Xem câu trả lời của @phobie.
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'
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'.