2009-11-20 29 views
11

Sử dụng Python2.4.5 (không hỏi!) Tôi muốn phân tích cú pháp chuỗi truy vấn và nhận được lệnh trả về. Tôi có phải làm điều đó "theo cách thủ công" như sau không?chuỗi truy vấn phân tích cú pháp bằng urllib trong Python 2.4

>>> qs = 'first=1&second=4&third=3' 
>>> d = dict([x.split("=") for x in qs.split("&")]) 
>>> d 
{'second': '4', 'third': '3', 'first': '1'} 

Không tìm thấy phương pháp hữu ích nào trong urlparse.

Trả lời

23

Bạn có hai lựa chọn:

>>> cgi.parse_qs(qs) 
{'second': ['4'], 'third': ['3'], 'first': ['1']} 

hoặc

>>> cgi.parse_qsl(qs) 
[('first', '1'), ('second', '4'), ('third', '3')] 

Các giá trị trong dict trả về bởi cgi.parse_qs() là danh sách chứ không phải là chuỗi, để xử lý các trường hợp khi các thông số tương tự được quy định nhiều lần:

>>> qs = 'tags=python&tags=programming' 
>>> cgi.parse_qs(qs) 
{'tags': ['python', 'programming']} 
+0

Cảm ơn rất nhiều, Pär! –

+0

lý do tại sao đó là một mảng được trả về? Tôi phải sử dụng: [0] để có được kết quả chuỗi cuối cùng. –

+0

@ Chen Chen: Câu hỏi của bạn có một chút không rõ ràng, nhưng nếu bạn hỏi tại sao giá trị trong dict được trả về bởi 'cgi.parse_qs()' là các danh sách thay vì chuỗi, câu trả lời là tham số tương tự có thể được chỉ định một vài lần, trong trường hợp đó nhiều giá trị phải được trả lại. Điều này được minh họa bằng ví dụ cuối cùng trong câu trả lời của tôi. –

9

điều này giải quyết được sự khó chịu:

d = dict(urlparse.parse_qsl(qs)) 

cá nhân tôi mong chờ có hai trình bao bọc được tạo sẵn trong urlparse. trong hầu hết các trường hợp, tôi không quan tâm đến việc loại bỏ tham số thừa nếu tồn tại như vậy

+0

parse_qsl được thêm vào 2.6, tại thời điểm đó có parse_qs đã trả về giá trị dict. Đó là những gì bạn có nghĩa là do một built-in? – Adam

1
import urlparse 
qs = 'first=1&second=4&third=3&first=0' 

print dict(urlparse.parse_qsl(qs)) 

OR 

print urlparse.parse_qs(qs) 
Các vấn đề liên quan