개발/Python

[파이썬] URL 매개변수에서 퍼센트 인코딩 하는 방법?

MinorMan 2023. 1. 21. 22:42
반응형

<질문>

만약 내가한다면

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

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


<답변1>

에서the documentation:

urllib.quote(string[, safe])

%xx 이스케이프를 사용하여 문자열의 특수 문자를 바꿉니다. 문자, 숫자 및 문자 '_.-'는 인용되지 않습니다. 기본적으로 이 함수는 URL의 경로 섹션을 인용하기 위한 것입니다. 선택적 safe 매개 변수는 인용하면 안 되는 추가 문자를 지정합니다. 기본값은 '/'입니다.

통과한다는 뜻입니다''~을 위한안전한첫 번째 문제를 해결할 것입니다.

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

두 번째 문제에 대해서는a bug report about it. 분명히 그것은 Python 3에서 수정되었습니다. 다음과 같이 인코딩하여 해결할 수 있습니다.UTF-8이와 같이:

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

그건 그렇고, 한번 봐봐urlencode.

파이썬 3에서 함수quote로 이동되었습니다urllib.parse:

>>> import urllib.parse
>>> print(urllib.parse.quote("Müller".encode('utf8')))
M%C3%BCller
>>> print(urllib.parse.unquote("M%C3%BCller"))
Müller

<답변2>

파이썬 3에서는urllib.quote로 이동되었습니다urllib.parse.quote, 그리고 그것은 처리 않습니다Unicode기본적으로.

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

<답변3>

제 생각에는 모듈requests훨씬 낫다. 그것은 기반urllib3.

다음을 시도할 수 있습니다.

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

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


<답변4>

당신이 사용하는 경우Django, 당신이 사용할 수있는urlquote:

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

Python에 대한 변경 사항은 이것이 이제 레거시 래퍼임을 의미합니다. 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)

<답변5>

사용하는 것이 좋습니다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

<답변6>

다음을 사용하는 대체 방법furl:

import furl

url = "https://httpbin.org/get?hello,world"
print(url)
url = furl.furl(url).url
print(url)

산출:

https://httpbin.org/get?hello,world
https://httpbin.org/get?hello%2Cworld
반응형