Kodowanie URL w Pythonie

Czy brakuje mi prostej metody w urllib lub innej bibliotece do tego zadania? Kodowanie adresu URL zastępuje niebezpieczne znaki ASCII znakiem"%", po którym następują dwie cyfry szesnastkowe.

Oto przykład wejścia i mojego oczekiwanego wyjścia:

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
Author: wim, 2012-01-18

3 answers

Dla Pythona 2.x, Użyj urllib.quote

Zastąp znaki specjalne w łańcuchu znaków za pomocą ucieczki % xx. Litery, cyfry i znaki"_.- nigdy nie są cytowane. Domyślnie ta funkcja jest przeznaczona do cytowania sekcji ścieżki adresu URL. Opcjonalny parametr safe określa Dodatkowe znaki, które nie powinny być cytowane - jego domyślną wartością jest '/'.

Przykład:

In [1]: import urllib

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

EDIT :

W Twoim przypadku, w celu zastąpienia spacji przez Plus znaki, można użyć urllib.quote_plus

Przykład:

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

Dla Pythona 3.x, Użyj quote

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

I dla Ciągu z wykorzystaniem spacjiquote_plus

>>> import urllib
>>> a = "as da& s#@das"
>>> urllib.parse.quote_plus(a)
'as+da%26+s%23%40das'
 47
Author: qiao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 10:05:35

Należy pamiętać, że zarówno urllib.cytat i urllib.quote_plus wyrzuca błąd, jeśli wejście jest ciągiem 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'

Jak odpowiedział tutaj na SO , trzeba użyć 'UTF-8' jawnie:

urllib.quote(s.encode('utf-8'))
 3
Author: oldbam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:23

Ponadto, jeśli masz dict kilku wartości, najlepszym sposobem na to będzie urllib.urlencode.

 1
Author: Y2H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 10:59:10