Как я могу нормализовать URL в Python

python url normalization normalize

60878 просмотра

8 ответа

Я хотел бы знать, нормализую ли я URL в Python.

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

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

Автор: Tom Feiner Источник Размещён: 23.08.2019 09:23

Ответы (8)


68 плюса

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

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

>>> from werkzeug.urls import 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))
Автор: Armin Ronacher Размещён: 23.09.2008 01:33

58 плюса

Реальное исправление в Python 2.7 для этой проблемы

Правильное решение было:

 # percent encode url, fixing lame server errors for e.g, like space
 # within url paths.
 fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]")

Для получения дополнительной информации см. Issue918368: «urllib не исправляет возвращенные URL-адреса сервера»

Автор: Oleg Sakharov Размещён: 10.05.2009 04:15

24 плюса

использовать urllib.quoteилиurllib.quote_plus

Из документации по urllib :

цитата (строка [, сейф])

Замените специальные символы в строке, используя escape-символ "% xx". Буквы, цифры и символы "_.-" никогда не заключаются в кавычки. Необязательный безопасный параметр указывает дополнительные символы, которые не должны заключаться в кавычки - его значение по умолчанию - «/».

Пример: quote('/~connolly/')доходность '/%7econnolly/'.

quote_plus (string [, safe])

Подобно quote (), но также заменяет пробелы на знаки плюс, как требуется для цитирования значений HTML-формы. Знаки плюса в исходной строке экранируются, если они не включены в сейф. Он также не имеет безопасного значения по умолчанию '/'.

РЕДАКТИРОВАТЬ: Использование 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 и urlparse.urlunparse для анализа URL- адреса и кодирования только пути. Это может быть более полезным для вас, хотя, если вы создаете URL-адрес из известного протокола и хоста, но с подозрительным путем, вы, вероятно, могли бы сделать то же самое, чтобы избежать urlparse и просто заключить в кавычки подозрительную часть URL-адреса, объединяя с известные безопасные части.

Автор: Blair Conrad Размещён: 23.09.2008 01:26

12 плюса

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

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

Я полагаю, что одним из результатов этого обсуждения была библиотека urlnorm.py Марка Ноттингема , которую я использовал с хорошими результатами в нескольких проектах. Однако этот скрипт не работает с URL-адресом, указанным в этом вопросе. Так что лучшим выбором может быть версия urlnorm.py Сэма Руби , которая обрабатывает этот URL, и все вышеупомянутые контрольные примеры из вики Atom.

Автор: cobra libre Размещён: 07.06.2009 04:35

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=":/")

Автор: tzot Размещён: 23.09.2008 01:25

3 плюса

Просто к вашему сведению, urlnorm перешел на github: http://gist.github.com/246089

Автор: Mark Nottingham Размещён: 16.12.2009 03:43

2 плюса

Действительно для Python 3.5:

import urllib.parse

urllib.parse.quote([your_url], "\./_-:")

пример:

import urllib.parse

print(urllib.parse.quote("http://www.example.com/foo goo/bar.html", "\./_-:"))

вывод будет http://www.example.com/foo%20goo/bar.html

Шрифт: https://docs.python.org/3.5/library/urllib.parse.html?highlight=quote#urllib.parse.quote

Автор: Hélder Lima Размещён: 05.03.2017 03:12

1 плюс

Я сталкиваюсь с такой проблемой: нужно указывать только пробел.

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

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

Автор: WKPlus Размещён: 13.06.2014 10:45
Вопросы из категории :
32x32