파이썬에서 쿼리 문자열을 urlencode하는 방법은 무엇입니까?


552

제출하기 전에이 문자열을 urlencode하려고합니다.

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

답변:


561

다음 urlencode()과 같이 매개 변수를 맵핑 (dict) 또는 2 개의 튜플 시퀀스 로 전달해야합니다 .

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

파이썬 3 이상

사용하다:

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

이것은 일반적으로 사용되는 의미에서 URL 인코딩을 수행 하지 않습니다 (출력 참조). 이를 위해 urllib.parse.quote_plus.


12
"urllib.urlencode가 항상 트릭을 수행하는 것은 아닙니다. 문제는 일부 서비스가 사전을 작성할 때 손실되는 인수 순서에주의를 기울이는 것입니다. 이러한 경우 Ricky가 제안한대로 urllib.quote_plus가 더 좋습니다. "
Blairg23

16
기술적으로, 그것은 서비스의 버그입니까?
holdenweb

5
전체 쿼리 인수 문자열을 작성하지 않고 문자열 URL을 안전하게 만들려면 어떻게해야합니까?
Mike 'Pomax'Kamermans 2016 년

1
@ Mike'Pomax'Kamermans-예를 들어 stackoverflow.com/questions/12082314/… 또는이 질문에 대한 Ricky의 답변을 참조하십시오 .
bgporter 2016 년

1
@ bk0 귀하의 방법은 문자열이 아닌 사전에만 유효합니다.
JD Gamboa

1021

파이썬 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'

파이썬 3

Python 3에서는 urllib패키지가 더 작은 구성 요소로 분리되었습니다. 사용합니다 urllib.parse.quote_plus( parse자식 모듈에 유의하십시오 )

import urllib.parse
urllib.parse.quote_plus(...)

4
감사! 그러나 제 경우에는 다음과 같이해야합니다.import urllib.parse ... urllib.parse.quote_plus(query)
ivkremer

3
URL 문자열이 유니 코드 인 경우 UTF-8로 인코딩해야합니다. 다른 방법이 있습니까?
Karl Doenitz

7
이것은 잘 작동하지만이 매개 변수 safe = '; /? : @ & = + $,'를 추가 할 때까지 일부 온라인 서비스 (REST)에 액세스 할 수 없었습니다.
rovyko

나는 파이썬 3에서 그것을 시도했지만 할 수 없었습니다 : stackoverflow.com/questions/40557606/…
양서류

1
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"커맨드 라인에 한 라이너
아모스 조슈아

52

urllib 대신 요청 을 시도 하면 urlencode를 신경 쓸 필요가 없습니다!

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

편집하다:

당신이 필요로하는 경우 명령 이름 - 값 쌍 다음 세트 PARAMS이 너무 좋아 이름 또는 여러 값을 :

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

사전을 사용하는 대신.


5
이것은 이름 값 쌍의 순서 문제를 해결하지 못하며, 프로젝트를 수행 할 수없는 외부 라이브러리를 설치할 수있는 권한이 필요합니다.
dreftymac

OP에 작동하는 최소 코드를 게시했습니다. OP는 주문 쌍을 요청하지 않았지만 가능합니다. 내 업데이트를 참조하십시오.
바니

@ dreftymac : 이것은 주문을 처리합니다 (질문의 일부는 아니지만), 업데이트 된 답변을 읽으십시오.
바니

36

문맥

  • 파이썬 (버전 2.7.2)

문제

  • urlencoded 쿼리 문자열을 생성하려고합니다.
  • 이름-값 쌍을 포함하는 사전 또는 객체가 있습니다.
  • 이름-값 쌍의 출력 순서를 제어 할 수 있기를 원합니다.

해결책

  • 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
  """ 


23

이 시도:

urllib.pathname2url(stringToURLEncode)

urlencode사전에서만 작동하기 때문에 작동하지 않습니다. quote_plus올바른 출력을 생성하지 못했습니다.


정말 도움이됩니다! 필자의 경우 URL 인코딩하려는 문자열의 일부 만 가지고 있습니다 (예 :로 변환 my string하려는 경우) my%20string. 귀하의 솔루션은 그것을위한 매력처럼 작동합니다!
TanguyP

%20대신에 나를 위해 일했습니다 +. 감사합니다
Jossef Harush

21

urllib.urlencode가 항상 트릭을 수행하지는 않습니다. 문제는 일부 서비스가 사전을 작성할 때 손실되는 인수의 순서를 관리한다는 것입니다. 이러한 경우 Ricky가 제안한 것처럼 urllib.quote_plus가 더 좋습니다.


2
튜플 목록을 전달하면 >>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
Brandon Rhodes

8

파이썬 3에서 이것은 나와 함께 일했습니다.

import urllib

urllib.parse.quote(query)

6

향후 참조를 위해 (예 : python3의 경우)

>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'

1
일반적으로는 URL 인코딩에 값을 원하는, 당신은 잘못된 GET 쿼리 할 것 여기에 한 일
Codewithcheese

'c:/2 < 3'Windows에서 출력 은 '///C://2%20%3C%203'입니다. 나는 단지 출력 할 무언가를 원한다 'c:/2%20%3C%203'.
binki

3

파이썬 2와 3을 모두 지원해야하는 스크립트 / 프로그램에서 사용하기 위해 6 개의 모듈은 따옴표 및 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'

2

urllib.parse.urlencode ()에서 오류가 발생하면 urllib3 모듈을 사용해보십시오.

구문은 다음과 같습니다 :

import urllib3
urllib3.request.urlencode({"user" : "john" }) 

1

이미 언급되지 않은 또 다른 것은 해당 매개 변수가없는 urllib.urlencode()사전 None대신 빈 값을 문자열로 인코딩 하는 것 입니다. 이것이 일반적으로 바람직한 지 모르겠지만 사용 사례에 맞지 않으므로 사용해야 quote_plus합니다.


0

Python 3 urllib3 이 제대로 작동하려면 공식 문서에 따라 다음과 같이 사용할 수 있습니다 .

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')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.