2008-09-23 6 views
64

Я хотел бы знать, нормализую ли я URL-адрес в python.Как я могу нормализовать URL-адрес в python

Например, если у меня есть URL-адрес строки, как: «http://www.example.com/foo гу/bar.html»

мне нужна библиотека в питона, который преобразует дополнительное пространство (или любой другой не нормированный характер) для надлежащего URL.

+0

Существует ответ более уточненный на StackOverflow здесь: http://stackoverflow.com/questions/10584861/canonize-normali ze-an-url-in-python/15629657 – stuckintheshuck 2013-04-08 21:31:45

+1

Я не думаю, что это лучше ... – 2014-07-14 20:59:57

ответ

10
import urlparse, urllib 
def myquote(url): 
    parts= urlparse.urlparse(url) 
    return urlparse.urlunparse(parts[:2] + urllib.quote(parts[2]) + parts[3:]) 

Это котировка только компонента пути.

В противном случае, вы могли бы сделать: urllib.quote(url, safe=":/")

+2

Это просто цитата всех персонажей. Это ему не поможет. – 2008-09-23 13:33:26

+0

В этом примере также будет указан символ ':' (не все). Спасибо за комментарий. – tzot 2008-09-23 13:49:49

21

использование 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-адреса, объединившись с известных безопасных частей.

+2

Итак, что возвращает urllib.quote с учетом URL-адреса вопроса? – tzot 2008-09-23 13:51:07

66

Посмотрите на этот модуль: werkzeug.utils.(В настоящее время в werkzeug.urls)

Функция вы ищете называется "url_fix" и как это работает:

>>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffsklärung)') 
'http://de.wikipedia.org/wiki/Elf%20%28Begriffskl%C3%A4rung%29' 

Он реализуется Werkzeug следующим образом:

import urllib 
import urlparse 

def url_fix(s, charset='utf-8'): 
    """Sometimes you get an URL by a user that just isn't a real 
    URL because it contains unsafe characters like ' ' and so on. This 
    function can fix some of the problems in a similar way browsers 
    handle data entered by the user: 

    >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffsklärung)') 
    'http://de.wikipedia.org/wiki/Elf%20%28Begriffskl%C3%A4rung%29' 

    :param charset: The target charset for the URL if the url was 
        given as unicode string. 
    """ 
    if isinstance(s, unicode): 
     s = s.encode(charset, 'ignore') 
    scheme, netloc, path, qs, anchor = urlparse.urlsplit(s) 
    path = urllib.quote(path, '/%') 
    qs = urllib.quote_plus(qs, ':&=') 
    return urlparse.urlunsplit((scheme, netloc, path, qs, anchor)) 
12

Поскольку эта страница является главным результатом для Google поиск по этой теме, я думаю, что стоит отметить какую-то работу, которая была проделана по URL нормализации отношений с Python, который выходит за рамки urlencoding космических символов. Например, работа с портами по умолчанию, случай символа, отсутствие концевой косой черты и т. Д.

Когда разрабатывался формат синдикации Atom, было некоторое обсуждение того, как нормализовать URL-адреса в каноническом формате; это описано в статье PaceCanonicalIds на вики-странице Atom/Pie. В этой статье приводятся некоторые хорошие тестовые примеры.

Я считаю, что одним из результатов этой дискуссии была библиотека urlnorm.py от Марка Ноттингема, которую я использовал с хорошими результатами по нескольким проектам. Однако этот скрипт не работает с URL-адресом, указанным в этом вопросе. Таким образом, лучшим выбором может быть Sam Ruby's version of urlnorm.py, который обрабатывает этот URL-адрес и все вышеупомянутые тестовые примеры из вики-файла Atom.

1

я встречаю такую ​​проблему: необходимость процитировать только пространство.

fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]") Помогите, но это слишком сложно.

Так что я использовал простой способ: url = url.replace(' ', '%20'), это не идеально, но это самый простой способ, и он работает для этой ситуации.

 Смежные вопросы

  • Нет связанных вопросов^_^