파이썬에서 URL 매개 변수를 퍼센트 인코딩하는 방법은 무엇입니까?


299

만약 내가한다면

url = "http://example.com?p=" + urllib.quote(query)
  1. 그것은 인코딩을하지 않습니다 /%2F(휴식 OAuth를 정상화)
  2. 유니 코드를 처리하지 않습니다 (예외가 발생 함)

더 나은 도서관이 있습니까?


1
이는 URL 매개 변수가 아닙니다 (FYI). 명확히해야합니다.
Jamie Marshall

답변:


390

파이썬 2

로부터 문서 :

urllib.quote(string[, safe])

% xx 이스케이프를 사용하여 문자열에서 특수 문자를 바꾸십시오. 문자, 숫자 및 문자 '_.-'는 인용되지 않습니다. 기본적으로이 함수는 URL의 경로 섹션을 인용하기위한 것입니다. 선택적 안전 매개 변수는 따옴표로 묶지 말아야하는 추가 문자를 지정 합니다. 기본값은 '/'입니다.

안전을 위해 ''를 전달하면 첫 번째 문제가 해결됩니다.

>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'

두 번째 문제에 대해서는 여기 에 대한 버그 보고서가 있습니다 . 분명히 파이썬 3에서 수정되었습니다. 다음과 같이 utf8로 인코딩하여 해결할 수 있습니다.

>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller

그건 그렇고 urlencode를 살펴보십시오.

파이썬 3

로 교체 urllib.quote하는 것을 제외하고는 동일 urllib.parse.quote합니다.


1
고마워, 둘 다 훌륭하게 일했다. urlencode는 루프에서 quoteplus를 여러 번 호출하므로 내 작업 (oauth)의 올바른 정규화가 아닙니다.
Paul Tarjan

6
사양 : rfc 2396 은 이것을 reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","urllib.quote가 처리하는 예약 된 것으로 정의합니다 .
Jeff Sheffield

63
urllib.quoteurlib.parse.quotePython3부터 로 이동했습니다 .
Hibou57

5
urllib.parse.quote docs
Andreas Haferburg

또한 검색어를 인코딩하는 경우 quote_plus : docs.python.org/3/library/…를 사용하는 것이 좋습니다. 1. 기본적으로 슬래시를 인코딩합니다. 2. 공백도 인코딩합니다
Pavel Vergeev

174

Python 3에서는 urllib.quote로 이동 urllib.parse.quote했으며 기본적으로 유니 코드를 처리합니다.

>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'

2
그 이름 quote은 전 세계적으로 모호합니다. urlencode :와 같은 것을 사용하는 것이 from urllib.parse import quote as urlencode좋습니다.
Luc

완전히 다른 기능을 수행 urlencode하는 urllib.parse이미 명명 된 함수 가 있으므로 다른 이름을 선택하거나 미래의 코드 독자에게 심각한 혼란을 줄 수 있습니다.
jaymmer-

48

내 대답은 Paolo의 대답과 비슷합니다.

모듈 requests이 훨씬 낫다고 생각합니다 . 에 기반합니다 urllib3. 당신은 이것을 시도 할 수 있습니다 :

>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'

5
requests.utils.quotepython 링크 quote입니다. 요청 소스를 참조하십시오 .
Cjkjvfn 작성일 :

16
requests.utils.quoteurllib.quote파이썬 2와 urllib.parse.quote파이썬 3 을 위한 얇은 호환성 래퍼입니다
Jeff Sheffield

13

django를 사용하는 경우 urlquote를 사용할 수 있습니다.

>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'

이 답변이 게시 된 이후 Python으로 변경하면 이것이 레거시 래퍼라는 것을 의미합니다. django.utils.http의 Django 2.1 소스 코드에서 :

A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)

2

urlencode여기 에 사용하는 것이 좋습니다 . 단일 매개 변수와 큰 차이는 없지만 IMHO는 코드를 명확하게 만듭니다. ( quote_plus특히 다른 언어에서 온 기능을 보는 것은 혼란스러워 보입니다 )

In [21]: query='lskdfj/sdfkjdf/ksdfj skfj'

In [22]: val=34

In [23]: from urllib.parse import urlencode

In [24]: encoded = urlencode(dict(p=query,val=val))

In [25]: print(f"http://example.com?{encoded}")
http://example.com?p=lskdfj%2Fsdfkjdf%2Fksdfj+skfj&val=34

문서

urlencode : https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode

quote_plus : https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus

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