Hoe een querystring urlencoderen in Python?

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 urllibopgedeeld in kleinere componenten. Je gebruikt urllib.parse.quote_plus(let op de parseonderliggende 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

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)

urlencodewerkt niet omdat het alleen op woordenboeken werkt. quote_plusheeft 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 Nonein 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_plusmoet 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')

Other episodes