Как я могу нормализовать URL в Python
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:1524 плюса
использовать 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:2612 плюса
Поскольку эта страница является лучшим результатом поиска в Google по этой теме, я думаю, что стоит упомянуть некоторую работу, проделанную по нормализации URL с помощью Python, которая выходит за рамки символов пробела в урленкодировании. Например, работа с портами по умолчанию, регистр символов, отсутствие конечных слешей и т. Д.
Когда разрабатывался формат синдикации Atom, шла дискуссия о том, как нормализовать URL-адреса в канонический формат; это задокументировано в статье PaceCanonicalIds на вики Atom / Pie. Эта статья содержит несколько хороших тестовых примеров.
Я полагаю, что одним из результатов этого обсуждения была библиотека urlnorm.py Марка Ноттингема , которую я использовал с хорошими результатами в нескольких проектах. Однако этот скрипт не работает с URL-адресом, указанным в этом вопросе. Так что лучшим выбором может быть версия urlnorm.py Сэма Руби , которая обрабатывает этот URL, и все вышеупомянутые контрольные примеры из вики Atom.
Автор: cobra libre Размещён: 07.06.2009 04:3510 плюса
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=":/")
3 плюса
Просто к вашему сведению, urlnorm перешел на github: http://gist.github.com/246089
Автор: Mark Nottingham Размещён: 16.12.2009 03:432 плюса
Действительно для 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:121 плюс
Я сталкиваюсь с такой проблемой: нужно указывать только пробел.
fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]")
помогу, но это слишком сложно.
Поэтому я использовал простой способ: url = url.replace(' ', '%20')
он не идеален, но это самый простой способ, и он подходит для этой ситуации.
Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- url .NET - получить протокол, хост и порт
- url Это имя файла или весь URL, используемый в качестве ключа в кеше браузера?
- url URL-адрес в Erlang
- url Как я могу нормализовать URL в Python
- url Измените URL в браузере, не загружая новую страницу с помощью JavaScript
- normalization Как поместить путь к файлу или URL в базу данных?
- normalization Как программно нормализовать сэмпл PCM на iOS 5?
- normalization Нормализовать строку в ColdFusion
- normalization Разделение юникод-сущностей по графемам
- normalize Можно ли нормализовать косинус-сходство?
- normalize Как нормализовать список положительных чисел в JavaScript?
- normalize Нормализовать столбцы панд данных
- normalize чистые лоты, отклик json в один фрейм данных