Antworten:
Sie müssen Ihre Parameter urlencode()
entweder als Mapping (Diktat) oder als Folge von 2-Tupeln übergeben, z.
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 oder höher
Verwenden:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Beachten Sie, dass dies nicht nicht url tun kodiert , in dem üblicherweise verwendeten Sinne (Blick auf der Ausgabe). Für diesen Gebrauch urllib.parse.quote_plus
.
Was Sie suchen ist 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'
In Python 3 wurde das urllib
Paket in kleinere Komponenten aufgeteilt. Sie verwenden urllib.parse.quote_plus
(beachten Sie das parse
untergeordnete Modul)
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"
für einen Einzeiler auf der Kommandozeile
Probieren Sie Anfragen anstelle von urllib aus und Sie müssen sich nicht um urlencode kümmern!
import requests
requests.get('http://youraddress.com', params=evt.fields)
BEARBEITEN:
Wenn Sie geordnete Name-Wert-Paare oder mehrere Werte für einen Namen benötigen, legen Sie folgende Parameter fest:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
anstatt ein Wörterbuch zu verwenden.
Das Folgende ist eine vollständige Lösung, einschließlich des Umgangs mit einigen Fallstricken.
### ********************
## 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()
mich selbst, da es %20
eher verwendet als +
.
Versuche dies:
urllib.pathname2url(stringToURLEncode)
urlencode
funktioniert nicht, weil es nur in Wörterbüchern funktioniert. quote_plus
hat nicht die richtige Ausgabe erzeugt.
my string
zu my%20string
. Ihre Lösung funktioniert wie ein Zauber dafür!
%20
statt +
. Vielen Dank
Beachten Sie, dass der urllib.urlencode nicht immer den Trick macht. Das Problem ist, dass sich einige Dienste um die Reihenfolge der Argumente kümmern, die beim Erstellen des Wörterbuchs verloren gehen. In solchen Fällen ist urllib.quote_plus besser, wie Ricky vorgeschlagen hat.
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
für zukünftige Referenzen (zB für python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
unter Windows ist '///C://2%20%3C%203'
. Ich möchte etwas, das nur ausgegeben wird 'c:/2%20%3C%203'
.
Für die Verwendung in Skripten / Programmen, die sowohl Python 2 als auch Python 3 unterstützen müssen, bietet das Sechs-Modul Anführungszeichen- und Urlencode-Funktionen:
>>> 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'
Die Syntax lautet wie folgt:
import urllib3
urllib3.request.urlencode({"user" : "john" })
Eine andere Sache, die möglicherweise noch nicht erwähnt wurde, ist, dass urllib.urlencode()
leere Werte im Wörterbuch als Zeichenfolge codiert werden, None
anstatt dass dieser Parameter nicht vorhanden ist. Ich weiß nicht, ob dies normalerweise erwünscht ist oder nicht, passt aber nicht zu meinem Anwendungsfall, daher muss ich es verwenden quote_plus
.
Für Python 3 funktioniert urllib3 ordnungsgemäß. Sie können Folgendes gemäß den offiziellen Dokumenten verwenden :
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')