私が行った場合
url = "http://example.com?p=" + urllib.quote(query)
/
エンコードしません%2F
(OAuth 正規化を破ります)- Unicode を処理しません (例外をスローします)
より良いライブラリはありますか?
ドキュメントから:
urllib.quote(string[, safe])
%xx エスケープを使用して、文字列内の特殊文字を置き換えます。文字、数字、および文字 '_.-' は決して引用符で囲まれません。デフォルトでは、この関数は URL のパス セクションを引用することを目的としています。オプションの safe パラメータは、引用してはならない追加の文字を指定します。デフォルト値は「/」です。
つまり''
、安全に渡すことで最初の問題が解決されます。
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
2 番目の問題については、バグ レポートがあります。どうやら Python 3 で修正されたようです。次のようにUTF-8としてエンコードすることで回避できます。
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
ところで、urlencodeを見てください。
Python 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
Python 3 では、urllib.quote
が に移動され、デフォルトでUnicodeurllib.parse.quote
を処理します。
>>> 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'
私の答えは、パオロの答えに似ています。