Ik probeer deze string te urlencoderen voordat ik deze verzend.
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
Antwoord 1, autoriteit 100%
U moet uw parameters doorgeven aan urlencode()
als ofwel een mapping (dict), of een reeks van 2-tupels, zoals:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 of hoger
Gebruik:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Merk op dat dit nietdoet aan url-codering in de algemeen gebruikte zin (kijk naar de uitvoer). Gebruik daarvoor urllib.parse.quote_plus
.
Antwoord 2, autoriteit 94%
Python 2
Wat u zoekt is urllib.quote_plus
:
safe_string = urllib.quote_plus('string_of_characters_like_these:$#@=?%^Q^$')
#Value: 'string_of_characters_like_these%3A%24%23%40%3D%3F%25%5EQ%5E%24'
Python 3
In Python 3 is het pakket urllib
opgedeeld in kleinere componenten. Je gebruikt urllib.parse.quote_plus
(let op de parse
onderliggende module)
import urllib.parse
safe_string = urllib.parse.quote_plus(...)
Antwoord 3, autoriteit 11%
Probeer requestsin plaats van urllib en u hoeft zich niet bezig te houden met urlencode !
import requests
requests.get('http://youraddress.com', params=evt.fields)
BEWERKEN:
Als je geordende naam-waardeparenof meerdere waarden voor een naam nodig hebt, stel dan de volgende parameters in:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
in plaats van een woordenboek te gebruiken.
Antwoord 4, autoriteit 6%
Context
- Python (versie 2.7.2 )
Probleem
- U wilt een urlencoded querystring genereren.
- Je hebt een woordenboek of object dat de naam-waardeparen bevat.
- U wilt de uitvoervolgorde van de naam-waardeparen kunnen regelen.
Oplossing
- urllib.urlencode
- urllib.quote_plus
Valkuilen
- woordenboek geeft willekeurige volgorde van naam-waardeparen weer
- zaken afhandelen waarin u NIETgeeft om de volgorde van de naam-waardeparen
- zaken afhandelen waarin u WELgeeft om de volgorde van de naam-waardeparen
- zaken afhandelen waarin een enkele naam meer dan één keer moet voorkomen in de set van alle naam-waardeparen
Voorbeeld
Het volgende is een complete oplossing, inclusief hoe om te gaan met enkele valkuilen.
### ********************
## 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" : "[email protected]",
}
### ********************
## 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
"""
5, Autoriteit 4%
Python 3:
urllib.parse.quote_plus (string, safe = ‘ ‘, Codering = Geen, Fouten = Geen)
6, Autoriteit 4%
Probeer dit:
urllib.pathname2url(stringToURLEncode)
urlencode
werkt niet omdat het alleen op woordenboeken werkt. quote_plus
heeft de juiste uitvoer niet geproduceerd.
7, Autoriteit 3%
Merk op dat de Urllib.urlencode niet altijd de truc doet. Het probleem is dat sommige diensten voor de orde van argumenten verzorgen, die verloren gaan wanneer u het woordenboek maakt. Voor dergelijke gevallen is Urllib.quote_plus beter, zoals Ricky voorgesteld.
8
In Python 3 werkte dit met mij
import urllib
urllib.parse.quote(query)
9
Voor toekomstige referenties (ex: voor Python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
10
Voor gebruik in scripts / programma’s die zowel Python 2 en 3 moeten ondersteunen, biedt de zes module offerte- en urlencode-functies:
>>> 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'
11
Een ander ding dat mogelijk al niet is genoemd, is dat urllib.urlencode()
codeert voor lege waarden in het woordenboek als de string None
in plaats van die parameter te hebben afwezig. Ik weet niet of dit typisch gewenst is of niet, maar past niet bij mijn gebruikscase, vandaar dat ik quote_plus
moet gebruiken.
12
Voor Python 3 Urllib3 Werkt op de juiste manier, u kunt als volgt gebruiken volgens het Officiële documenten :
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')