Как urlencode строки запроса в Python? - PullRequest
505 голосов
/ 10 апреля 2011

Я пытаюсь кодировать эту строку перед отправкой.

queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"]; 

Ответы [ 13 ]

952 голосов
/ 19 февраля 2012

Python 2

То, что вы ищете, это 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

В Python 3 пакет urllib был разбит на более мелкие компоненты. Вы будете использовать urllib.parse.quote_plus (обратите внимание на дочерний модуль parse)

import urllib.parse
urllib.parse.quote_plus(...)
502 голосов
/ 10 апреля 2011

Вам необходимо передать ваши параметры в urlencode() как отображение (dict) или последовательность из двух кортежей, например:

>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'

Python3 или выше

Использование:

>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event

Обратите внимание, что это , а не делает кодирование URL в общепринятом смысле (посмотрите на вывод).Для этого используйте urllib.parse.quote_plus.

41 голосов
/ 01 сентября 2013

Попробуйте запросы вместо urllib, и вам не нужно беспокоиться об urlencode!

import requests
requests.get('http://youraddress.com', params=evt.fields)

EDIT:

Если вам нужно упорядоченные пары имя-значение или несколько значений для имени, установите параметры следующим образом:

params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]

вместо использования словаря.

37 голосов
/ 06 сентября 2013

Контекст

  • Python (версия 2.7.2)

Проблема

  • Вы хотите сгенерировать строку запроса в кодировке urlen.
  • У вас есть словарь или объект, содержащий пары имя-значение.
  • Вы хотите иметь возможность управлять порядком вывода пар имя-значение.

Решение

  • urllib.urlencode
  • urllib.quote_plus

Ловушки

Пример

Ниже приведено полное решение, в том числе способы устранения некоторых ошибок.

### ********************
## 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
  """ 
25 голосов
/ 28 февраля 2012
21 голосов
/ 14 июля 2014

Попробуйте:

urllib.pathname2url(stringToURLEncode)

urlencode не будет работать, потому что он работает только со словарями.quote_plus не выдал правильный вывод.

21 голосов
/ 01 мая 2012

Обратите внимание, что urllib.urlencode не всегда справляется с задачей.Проблема в том, что некоторые сервисы заботятся о порядке аргументов, который теряется при создании словаря.Для таких случаев лучше использовать urllib.quote_plus, как предложил Рики.

7 голосов
/ 21 октября 2015

В Python 3 это работало со мной

import urllib

urllib.parse.quote(query)
5 голосов
/ 19 марта 2013

для будущих ссылок (например: для python3)

>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
2 голосов
/ 18 января 2019

Для использования в сценариях / программах, которые должны поддерживать как Python 2, так и 3, шестой модуль предоставляет функции кавычек и 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...