Sau khi sử dụng cgi.parse_qs()
, làm thế nào để chuyển kết quả (từ điển) trở lại chuỗi truy vấn? Tìm kiếm một cái gì đó tương tự như urllib.urlencode()
.
Sau khi sử dụng cgi.parse_qs()
, làm thế nào để chuyển kết quả (từ điển) trở lại chuỗi truy vấn? Tìm kiếm một cái gì đó tương tự như urllib.urlencode()
.
Câu trả lời:
urllib.parse.
urlencode
(truy vấn, liều lượngq = Sai, [...])Chuyển đổi một đối tượng ánh xạ hoặc một chuỗi các bộ gồm hai phần tử, có thể chứa các đối tượng str hoặc byte, thành chuỗi văn bản ASCII được mã hóa theo phần trăm.
- Tài liệu Python 3
urllib.parse
A dict
là một ánh xạ.
urllib.urlencode
(query
[,doseq
])
Chuyển đổi một đối tượng ánh xạ hoặc một chuỗi các bộ giá trị hai phần tử thành một chuỗi "được mã hóa phần trăm" ... một chuỗi cáckey=value
cặp được phân tách bằng'&'
ký tự ...- Tài liệu Python 2.7
urllib
dict
trả về cgi.parse_qs()
thực sự có list
s là "giá trị" của nó. Chuyển thẳng vào sẽ dẫn đến các chuỗi truy vấn trông rất kỳ quặc.
Trong python3, hơi khác:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
đầu ra: 'pram1=foo¶m2=bar'
để tương thích với python2 và python3, hãy thử điều này:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
Bạn đang tìm kiếm một cái gì đó giống hệt nhưurllib.urlencode()
!
Tuy nhiên, khi bạn gọi parse_qs()
(khác với parse_qsl()
), khóa từ điển là tên biến truy vấn duy nhất và giá trị là danh sách giá trị cho mỗi tên.
Để chuyển thông tin này vào urllib.urlencode()
, bạn phải "san phẳng" các danh sách này. Đây là cách bạn có thể làm điều đó với một danh sách toàn bộ các bộ giá trị:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
.
Có thể bạn đang tìm kiếm một cái gì đó như thế này:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Nó cần một từ điển và chuyển đổi nó thành một chuỗi truy vấn, giống như urlencode. Nó sẽ thêm một dấu "&" cuối cùng vào chuỗi truy vấn, nhưng sẽ return query[:-1]
khắc phục điều đó, nếu đó là sự cố.
str.join()
chưa? Làm thế nào về urllib.quote_plus()
?
urlencode
trongurllib.py
(nó nên bởi bằng Python của bạn cài đặt) để xem lý do tại sao việc tạo ra một chuỗi truy vấn là đôi khi không hoàn toàn đơn giản như câu trả lời của bạn ngụ ý (đặc biệt là sự cần thiết phải 'quote' nhất định ký tự không hợp lệ trong một URL). @Ignacio cũng đã tham khảo hai chức năng có thể làm sạch quá trình triển khai của bạn và làm cho nó chính xác.
from urllib.parse import urlencode; urlencode(your_dict)
) ngắn hơn và dễ hơn cách này! Tôi sẽ cho rằng đôi khi thật thông minh khi sáng tạo lại bánh xe, thậm chí là kém chất lượng, khi việc sử dụng các bánh xe hiện có, được thiết kế tốt, nhưng ở đây, việc sử dụng bánh xe có sẵn sẽ dễ dàng và nhanh chóng hơn so với việc lăn bánh xe kém hơn của bạn .
cgi.parse_qs()
không được dùng nữa. Thay vào đó, hãy sử dụng urlparse.parse_qs ().