문제

만약 내가한다면

url = "http://example.com?p=" + urllib.quote(query)
  1. 인코딩되지 않습니다 / 에게 %2F (Oauth 정규화를 중단)
  2. 유니 코드를 처리하지 않습니다 (예외를 던진다)

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

도움이 되었습니까?

해결책

로부터 문서:

urllib.quote(string[, safe])

%XX 이스케이프를 사용하여 문자열의 특수 문자를 교체하십시오. 문자, 숫자 및 캐릭터 '_.-'는 결코 인용되지 않습니다. 기본적 으로이 함수는 URL의 경로 섹션을 인용하기위한 것입니다. 선택 사항 안전 매개 변수는 인용해서는 안되는 추가 문자를 지정합니다. 기본값은 '/'입니다.

즉,``Safe for Safe를 통과하는 것은 첫 번째 문제를 해결합니다.

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

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

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

그건 그렇고 urlencode

메모 저것 urllib.quote 이사 urllib.parse.quote python3에서

다른 팁

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/'

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

나는 모듈을 생각한다 requests 훨씬 낫다. 그것은 기반입니다 urllib3. 당신은 이것을 시도 할 수 있습니다 :

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

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

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

이 답변이 게시되었으므로 파이썬 변경은 이것이 이제 레거시 래퍼임을 의미합니다. django 2.1 django.utils.http의 소스 코드에서 :

A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top