Yanıtlar:
Parametrelerinizi urlencode()bir eşleme (dikte) veya bir dizi 2 tuple olarak geçirmeniz gerekir, örneğin:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 veya üstü
kullanın:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Bu olmadığını Not değil yaygın kullanılan anlamda (çıkışta göz) kodlayan url yapmak. Bu kullanım için urllib.parse.quote_plus.
Aradığın şey 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'te, urllibpaket daha küçük bileşenlere ayrılmıştır. Kullanacaksınız urllib.parse.quote_plus( parsealt modülü not edin )
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"komut satırında bir astar için
Urllib yerine istekleri deneyin ve urlencode ile uğraşmanıza gerek yok!
import requests
requests.get('http://youraddress.com', params=evt.fields)
DÜZENLE:
Bir ad için sıralı ad-değer çiftlerine veya birden çok değere ihtiyacınız varsa aşağıdaki gibi parametreler ayarlayın:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
sözlük kullanmak yerine.
Aşağıdakiler, bazı tuzaklarla nasıl başa çıkılacağı dahil olmak üzere eksiksiz bir çözümdür.
### ********************
## 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()kullandığı beri kendim %20yerine +.
Bunu dene:
urllib.pathname2url(stringToURLEncode)
urlencodeişe yaramaz çünkü sadece sözlüklerde çalışır. quote_plusdoğru çıktıyı vermedi.
my stringüzere my%20string. Çözümünüz bunun için bir cazibe gibi çalışıyor!
%20yerine +. Teşekkürler
Urllib.urlencode'un her zaman hile yapmadığını unutmayın. Sorun, bazı hizmetlerin sözlüğü oluşturduğunuzda kaybolan argümanların sırasını önemsemesidir. Bu gibi durumlarda, Ricky'nin önerdiği gibi urllib.quote_plus daha iyidir.
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
gelecekteki referanslar için (ör: python3 için)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'Windows için çıktı '///C://2%20%3C%203'. Sadece çıktı alabilecek bir şey istiyorum 'c:/2%20%3C%203'.
Hem python 2 hem de 3'ü desteklemesi gereken komut dosyalarında / programlarda kullanım için, altı modül alıntı ve urlencode işlevleri sağlar:
>>> 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'
Sözdizimi aşağıdaki gibidir:
import urllib3
urllib3.request.urlencode({"user" : "john" })
Daha önce bahsedilmemiş olabilecek başka bir şey, söz konusu parametrenin bulunmaması yerine urllib.urlencode()sözlükteki boş değerleri dize olarak kodlayacağıdır None. Bunun tipik olarak istenip istenmediğini bilmiyorum, ancak kullanım durumuma uymuyor, bu yüzden kullanmam gerekiyor quote_plus.
Python 3 için urllib3 düzgün çalışıyor, resmi belgelerine göre aşağıdaki gibi kullanabilirsiniz :
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')