Câu trả lời:
Bạn cần chuyển các tham số của mình thành urlencode()
một ánh xạ (dict) hoặc một chuỗi gồm 2 bộ dữ liệu, như:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 trở lên
Sử dụng:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Lưu ý rằng điều này không thực hiện mã hóa url theo nghĩa thường được sử dụng (nhìn vào đầu ra). Đối với việc sử dụng đó urllib.parse.quote_plus
.
Những gì bạn đang tìm kiếm là urllib.quote_plus
:
>>> urllib.quote_plus('string_of_characters_like_these:$#@=?%^Q^$')
'string_of_characters_like_these%3A%24%23%40%3D%3F%25%5EQ%5E%24'
Trong Python 3, urllib
gói đã được chia thành các thành phần nhỏ hơn. Bạn sẽ sử dụng urllib.parse.quote_plus
(lưu ý parse
mô-đun con)
import urllib.parse
urllib.parse.quote_plus(...)
import urllib.parse ... urllib.parse.quote_plus(query)
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"
cho một lớp lót trên dòng lệnh
Hãy thử các yêu cầu thay vì urllib và bạn không cần phải bận tâm với urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
BIÊN TẬP:
Nếu bạn cần các cặp giá trị tên được đặt hàng hoặc nhiều giá trị cho một tên thì hãy đặt tham số như sau:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
thay vì sử dụng từ điển
Sau đây là một giải pháp hoàn chỉnh, bao gồm cách đối phó với một số cạm bẫy.
### ********************
## init python (version 2.7.2 )
import urllib
### ********************
## first setup a dictionary of name-value pairs
dict_name_value_pairs = {
"bravo" : "True != False",
"alpha" : "http://www.example.com",
"charlie" : "hello world",
"delta" : "1234567 !@#$%^&*",
"echo" : "user@example.com",
}
### ********************
## setup an exact ordering for the name-value pairs
ary_ordered_names = []
ary_ordered_names.append('alpha')
ary_ordered_names.append('bravo')
ary_ordered_names.append('charlie')
ary_ordered_names.append('delta')
ary_ordered_names.append('echo')
### ********************
## show the output results
if('NO we DO NOT care about the ordering of name-value pairs'):
queryString = urllib.urlencode(dict_name_value_pairs)
print queryString
"""
echo=user%40example.com&bravo=True+%21%3D+False&delta=1234567+%21%40%23%24%25%5E%26%2A&charlie=hello+world&alpha=http%3A%2F%2Fwww.example.com
"""
if('YES we DO care about the ordering of name-value pairs'):
queryString = "&".join( [ item+'='+urllib.quote_plus(dict_name_value_pairs[item]) for item in ary_ordered_names ] )
print queryString
"""
alpha=http%3A%2F%2Fwww.example.com&bravo=True+%21%3D+False&charlie=hello+world&delta=1234567+%21%40%23%24%25%5E%26%2A&echo=user%40example.com
"""
urllib.parse.quote()
bản thân mình vì nó sử dụng %20
hơn là +
.
Thử cái này:
urllib.pathname2url(stringToURLEncode)
urlencode
sẽ không hoạt động vì nó chỉ hoạt động trên từ điển. quote_plus
không tạo ra đầu ra chính xác.
my string
thành my%20string
. Giải pháp của bạn hoạt động như một cơ duyên cho điều đó!
%20
thay vì +
. Cảm ơn
Lưu ý rằng urllib.urlencode không phải lúc nào cũng thực hiện thủ thuật. Vấn đề là một số dịch vụ quan tâm đến thứ tự của các đối số, bị mất khi bạn tạo từ điển. Đối với những trường hợp như vậy, urllib.quote_plus tốt hơn, như Ricky đề xuất.
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
để tham khảo trong tương lai (ví dụ: cho python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
Windows là '///C://2%20%3C%203'
. Tôi muốn một cái gì đó sẽ chỉ xuất ra 'c:/2%20%3C%203'
.
Để sử dụng trong các tập lệnh / chương trình cần hỗ trợ cả python 2 và 3, mô-đun sáu cung cấp các hàm quote và urlencode:
>>> from six.moves.urllib.parse import urlencode, quote
>>> data = {'some': 'query', 'for': 'encoding'}
>>> urlencode(data)
'some=query&for=encoding'
>>> url = '/some/url/with spaces and %;!<>&'
>>> quote(url)
'/some/url/with%20spaces%20and%20%25%3B%21%3C%3E%26'
Các cú pháp như sau:
import urllib3
urllib3.request.urlencode({"user" : "john" })
Một điều khác có thể chưa được đề cập là urllib.urlencode()
sẽ mã hóa các giá trị trống trong từ điển dưới dạng chuỗi None
thay vì không có tham số đó. Tôi không biết điều này thường được mong muốn hay không, nhưng không phù hợp với trường hợp sử dụng của tôi, do đó tôi phải sử dụng quote_plus
.
Để Python 3 urllib3 hoạt động chính xác, bạn có thể sử dụng như sau theo tài liệu chính thức của nó :
import urllib3
http = urllib3.PoolManager()
response = http.request(
'GET',
'https://api.prylabs.net/eth/v1alpha1/beacon/attestations',
fields={ # here fields are the query params
'epoch': 1234,
'pageSize': pageSize
}
)
response = attestations.data.decode('UTF-8')