использование urllib.quote
или urllib.quote_plus
От urllib documentation:
цитата (строка [, безопасное])
Заменяет специальные символы в строке , используя escape-кнопку «% xx». Письма, цифры, а символы «_.-» - никогда не цитируются. Опциональный параметр safe указывает дополнительные символы , которые не должны быть указаны - его значением по умолчанию является '/'.
Пример: quote('/~connolly/')
дает '/%7econnolly/'
.
quote_plus (строка [, сейф])
Как цитаты(), но и заменяет пространства знаками плюс, как это требуется для цитирования значения HTML-форм. Плюс знаки в исходной строке экранированы, если они не включены в сейф. Он также не имеет безопасного значения по умолчанию '/'.
EDIT: Использование urllib.quote или urllib.quote_plus на весь URL будет искажать ее, как @ ΤΖΩΤΖΙΟΥ указывает:
>>> quoted_url = urllib.quote('http://www.example.com/foo goo/bar.html')
>>> quoted_url
'http%3A//www.example.com/foo%20goo/bar.html'
>>> urllib2.urlopen(quoted_url)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\python25\lib\urllib2.py", line 124, in urlopen
return _opener.open(url, data)
File "c:\python25\lib\urllib2.py", line 373, in open
protocol = req.get_type()
File "c:\python25\lib\urllib2.py", line 244, in get_type
raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: http%3A//www.example.com/foo%20goo/bar.html
@ ΤΖΩΤΖΙΟΥ предоставляет функцию, которая использует urlparse.urlparse and urlparse.urlunparse для разбора URL и только кодировать путь. Это может быть более полезным для вас, хотя, если вы создаете URL-адрес из известного протокола и хоста, но с подозрительным путем, вы, вероятно, могли бы сделать так же, чтобы избежать urlparse и просто указать подозрительную часть URL-адреса, объединившись с известных безопасных частей.
Существует ответ более уточненный на StackOverflow здесь: http://stackoverflow.com/questions/10584861/canonize-normali ze-an-url-in-python/15629657 – stuckintheshuck 2013-04-08 21:31:45
Я не думаю, что это лучше ... – 2014-07-14 20:59:57