質問

私が行った場合

url = "http://example.com?p=" + urllib.quote(query)
  1. エンコードしません /%2F (OAUTHの正規化を破壊)
  2. Unicodeを処理しません(例外をスローします)

より良いライブラリはありますか?

役に立ちましたか?

解決

から ドキュメント:

urllib.quote(string[, safe])

%xxエスケープを使用して、文字列の特殊文字を交換します。文字、数字、キャラクターの_.- 'は引用されません。デフォルトでは、この関数はURLのパスセクションを引用することを目的としています。オプションの安全パラメーターは、引用すべきではない追加の文字を指定します - そのデフォルト値は「/」です

それは、安全のために合格することを意味します。

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

2番目の問題について、それについてのバグレポートがあります ここ. 。どうやら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 デフォルトではUnicodeを処理します。

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

私の答えはパオロの答えに似ています。

モジュールだと思います 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'

この回答が公開されたため、Pythonの変更は、これが現在レガシーラッパーになっていることを意味することに注意してください。 django.utils.httpのdjango2.1ソースコードから:

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