web-dev-qa-db-ja.com

pythonのURLエンコーディング

このタスクのためにurllibまたは他のライブラリに欠けている簡単な方法はありますか? URLエンコードは、安全でないASCII文字を "%"の後に2桁の16進数で置き換えます。

入力と予想される出力の例を次に示します。

Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Galaxy Nexus Build/IFL10C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0%3B+xx-xx%3B+Galaxy+Nexus+Build%2FIFL10C%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Mobile+Safari%2F534.30
25
wim

Python 2.xの場合、 urllib.quote

%xxエスケープを使用して、stringの特殊文字を置き換えます。文字、数字、および文字「_.-」は引用されません。デフォルトでは、この関数はURLのパスセクションを引用するためのものです。オプションのsafeパラメータは、引用符で囲まない追加の文字を指定します。デフォルト値は「/」です。

例:

In [1]: import urllib

In [2]: urllib.quote('%')
Out[2]: '%25'

[〜#〜] edit [〜#〜]

あなたの場合、スペースをプラス記号に置き換えるには、 urllib.quote_plus

例:

In [4]: urllib.quote_plus('a b')
Out[4]: 'a+b'

Python 3.x、 quote を使用

>>> import urllib
>>> a = "asdas#@das"
>>> urllib.parse.quote(a)
'asdas%23%40das'

そして、スペースを含む文字列には quote_plus

>>> import urllib
>>> a = "as da& s#@das"
>>> urllib.parse.quote_plus(a)
'as+da%26+s%23%40das'
49
qiao

rllib.quoterllib.quote_plus は、入力がUnicode文字列の場合にエラーをスローすることに注意してください。

s = u'\u2013'
urllib.quote(s)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\urllib.py", line 1303, in quote
    return ''.join(map(quoter, s))
KeyError: u'\u2013'

ここではSO と答えたように、明示的に 'UTF-8'を使用する必要があります。

urllib.quote(s.encode('utf-8'))
3
oldbam

また、いくつかの値の辞書がある場合、それを行う最良の方法はurllib.urlencode

1
Y2H