ฉันพยายามที่จะ urlencode สตริงนี้ก่อนที่ฉันจะส่ง
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
ฉันพยายามที่จะ urlencode สตริงนี้ก่อนที่ฉันจะส่ง
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
คำตอบ:
คุณต้องส่งพารามิเตอร์ของคุณให้urlencode()
เป็นทั้งการจับคู่ (dict) หรือลำดับของ 2-tuples เช่น:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 ขึ้นไป
ใช้:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
โปรดทราบว่านี่ไม่ใช่การเข้ารหัส url ในความหมายที่ใช้กันทั่วไป (ดูที่เอาต์พุต) สำหรับการใช้งานurllib.parse.quote_plus
นั้น
สิ่งที่คุณกำลังมองหาคือ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'
ใน Python 3 urllib
แพ็คเกจได้ถูกแบ่งออกเป็นส่วนประกอบที่เล็กกว่า คุณจะใช้urllib.parse.quote_plus
(หมายเหตุparse
โมดูลย่อย)
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"
สำหรับหนึ่งซับในบรรทัดคำสั่ง
ลองใช้คำขอแทน urllib และคุณไม่จำเป็นต้องกังวลกับ urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
แก้ไข:
หากคุณต้องการคู่ค่าชื่อที่เรียงลำดับหรือหลายค่าสำหรับชื่อให้ตั้งค่าพารามิเตอร์ดังนี้:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
แทนที่จะใช้พจนานุกรม
ต่อไปนี้เป็นโซลูชันที่สมบูรณ์รวมถึงวิธีจัดการกับข้อผิดพลาดบางอย่าง
### ********************
## 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()
ตัวเองเพราะมันใช้มากกว่า%20
+
ลองสิ่งนี้:
urllib.pathname2url(stringToURLEncode)
urlencode
จะไม่ทำงานเพราะใช้งานได้กับพจนานุกรมเท่านั้น quote_plus
ไม่ได้สร้างผลลัพธ์ที่ถูกต้อง
my string
my%20string
โซลูชันของคุณทำงานได้อย่างมีเสน่ห์สำหรับสิ่งนั้น!
%20
+
ขอบคุณ
โปรดทราบว่า urllib.urlencode ไม่ได้ทำเคล็ดลับเสมอ ปัญหาคือบริการบางบริการดูแลเกี่ยวกับลำดับของการขัดแย้งซึ่งจะหายไปเมื่อคุณสร้างพจนานุกรม สำหรับกรณีเช่นนี้ urllib.quote_plus จะดีกว่าดังที่ Ricky แนะนำ
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
ใน Python 3 สิ่งนี้ใช้ได้กับฉัน
import urllib
urllib.parse.quote(query)
สำหรับการอ้างอิงในอนาคต (เช่น: สำหรับ python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
บน Windows '///C://2%20%3C%203'
คือ 'c:/2%20%3C%203'
ฉันต้องการสิ่งที่จะเป็นเพียงแค่การส่งออก
สำหรับใช้ในสคริปต์ / โปรแกรมที่จำเป็นต้องรองรับทั้ง python 2 และ 3 โมดูลทั้งหกมีฟังก์ชั่น quote และ 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'
ไวยากรณ์เป็นดังนี้:
import urllib3
urllib3.request.urlencode({"user" : "john" })
อีกสิ่งที่อาจไม่ได้กล่าวถึงแล้วคือการurllib.urlencode()
เข้ารหัสค่าว่างในพจนานุกรมเป็นสตริงNone
แทนที่จะมีพารามิเตอร์ขาด ผมไม่ทราบว่านี้มักจะเป็นที่ต้องการหรือไม่ quote_plus
แต่ไม่พอดีกับกรณีการใช้งานของฉันดังนั้นฉันต้องใช้
สำหรับ Python 3 urllib3ทำงานได้อย่างถูกต้องคุณสามารถใช้ดังต่อไปนี้ตามเอกสารอย่างเป็นทางการ :
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')