Я получил url
от пользователя, и я должен ответить полученным HTML.
Как я могу проверить, не имеет ли URL неправильный формат?
Например :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
Как мы можем этого добиться?
python
url
malformedurlexception
Югал Джиндл
источник
источник
url='http://google'
не деформирован. Схема + имя хоста всегда действительна.Ответы:
Регулярное выражение проверки URL-адреса django ( источник ):
источник
ftp
? Или у меня старая версия django?http://[2001:0DB8::3]:8080/index.php?valid=true#result
На самом деле, я считаю, что это лучший способ.
Если вы установите
verify_exists
наTrue
, он фактически проверит, существует ли URL-адрес, в противном случае он просто проверит, правильно ли он сформирован.edit: ах да, этот вопрос является дубликатом этого: как я могу проверить, существует ли URL-адрес с помощью валидаторов Django?
источник
verify_exists
устарела. -1verify_exists
не существует. Также вместоval
переменной вы можете называть это такURLValidator()('http://www.google.com')
Используйте пакет валидаторов :
Установите его из PyPI с помощью pip (
pip install validators
).источник
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})
Версия True или False на основе ответа @DMfll:
дает:
источник
True
для строкиfake
или даже для пустой строки. Ошибок никогда не будет, потому что эти атрибуты есть всегда, и список всегда будет иметь логическое значение True, потому что он содержит эти атрибуты. Даже если все атрибуты равны None, список все равно будет непустым. Вам нужна некоторая проверка атрибутов, потому что все проходит так, как у вас сейчас.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")
печатает «Я прав». когда я его запускаю.[result.scheme, result.netloc, result.path]
всегда оцениваетTrue
.print("I am True") if [] else print("I am False.")
печатает «Я неправ». поэтому пустые списки ложны. Содержимое массива требует оценки с помощью чего-то вродеall
функции.result.path
с теста.scheme
:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):
В настоящее время я использую следующее, основываясь на ответе Падама:
А это выглядит так:
Просто используйте
is_url("http://www.asdf.com")
.Надеюсь, поможет!
источник
https://https://https://www.foo.bar
.нота - lepl больше не поддерживается, извините (вы можете его использовать, и я думаю, что приведенный ниже код работает, но он не будет получать обновления).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html определяет, как это сделать (для URL-адресов http и электронной почты). Я реализовал его рекомендации на Python с помощью lepl (библиотека парсера). см. http://acooke.org/lepl/rfc3696.html
использовать:
источник
Я попал на эту страницу, пытаясь найти разумный способ проверки строк как «действительных» URL-адресов. Я делюсь здесь своим решением с использованием python3. Никаких дополнительных библиотек не требуется.
См. Https://docs.python.org/2/library/urlparse.html если вы используете python2.
См. Https://docs.python.org/3.0/library/urllib.parse.html, если вы используете python3, как и я.
Вот более краткая функция:
источник
РЕДАКТИРОВАТЬ
Это просто и работает:
So
min_attr
содержит базовый набор строк, которые должны присутствовать для определения действительности URL-адреса, то естьhttp://
части иgoogle.com
части.urlparse.scheme
магазиныhttp://
иurlparse.netloc
сохранить доменное имяgoogle.com
all()
возвращает истину, если все переменные внутри нее возвращают истину. Таким образом, еслиresult.scheme
иresult.netloc
присутствует, т.е. имеет какое-то значение, тогда URL-адрес действителен и, следовательно, возвращаетсяTrue
.источник
https://www.google
- действительный URL. На самом деле он может не разрешиться, но если вас это волнует, вам необходимо выполнить проверку DNS.Подтвердить URL-адрес с помощью
urllib
регулярного выражения, подобного DjangoРегулярное выражение проверки URL-адреса Django было на самом деле довольно хорошим, но мне нужно было немного его настроить для моего варианта использования. Не стесняйтесь адаптировать его к своему!
Python 3.7
объяснение
scheme
иnetloc
часть данного URL. (Чтобы сделать это правильно, я разделил URL-адресurllib.parse.urlparse()
на две соответствующие части, которые затем сопоставляются с соответствующими условиями регулярного выражения.)netloc
Часть останавливается до первого появления косых черт/
, так чтоport
цифры все еще частьюnetloc
, например:Адреса IPv4 также проверяются
Поддержка IPv6
Если вы хотите, чтобы валидатор URL также работал с адресами IPv6, сделайте следующее:
is_valid_ipv6(ip)
из ответа Маркуса Джардерота , в котором есть действительно хорошее регулярное выражение валидатора IPv6and not is_valid_ipv6(domain)
к последнемуif
Примеры
Вот несколько примеров регулярного выражения для части
netloc
(akadomain
) в действии:источник
Все вышеперечисленные решения распознают строку типа " http://www.google.com/path,www.yahoo.com/path " как допустимую. Это решение всегда работает так, как должно
источник
path
состоит изsegment
s, которые построены изpchar
s, которая может бытьsub-delims
одной из них","
.