web-dev-qa-db-fra.com

Encodage d'URL en python

Existe-t-il une méthode simple qui me manque dans urllib ou dans une autre bibliothèque pour cette tâche? Le codage d'URL remplace les caractères dangereux ASCII avec un "%" suivi de deux chiffres hexadécimaux.

Voici un exemple d'entrée et de sortie attendue:

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

Pour Python 2.x, utilisez urllib.quote

Remplacez les caractères spéciaux dans la chaîne à l'aide de l'échappement% xx. Les lettres, les chiffres et les caractères '_.-' ne sont jamais cités. Par défaut, cette fonction est destinée à citer la section de chemin de l'URL. Le paramètre optionnel sûr spécifie des caractères supplémentaires qui ne doivent pas être cités - sa valeur par défaut est '/'.

exemple:

In [1]: import urllib

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

[~ # ~] éditez [~ # ~] :

Dans votre cas, afin de remplacer l'espace par des signes plus, vous pouvez utiliser urllib.quote_plus

exemple:

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

Pour Python 3.x, utilisez quote

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

et pour une chaîne avec espace quote_plus

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

Gardez à l'esprit que rllib.quote et rllib.quote_plus génèrent une erreur si une entrée est une chaîne 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'

Comme répondu ici sur SO , il faut utiliser explicitement 'UTF-8':

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

De plus, si vous avez un dict de plusieurs valeurs, la meilleure façon de le faire sera urllib.urlencode.

1
Y2H