나는 url
사용자로부터 받았으며 가져온 HTML로 회신해야합니다.
URL 형식이 잘못되었는지 어떻게 확인할 수 있습니까?
예 :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
이것을 어떻게 이룰 수 있습니까?
답변
장고 URL 유효성 검사 정규식 ( 소스 ) :
import re
regex = re.compile(
r'^(?:http|ftp)s?://' # http:// or https://
r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
r'localhost|' #localhost...
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
r'(?::\d+)?' # optional port
r'(?:/?|[/?]\S+)$', re.IGNORECASE)
print(re.match(regex, "http://www.example.com") is not None) # True
print(re.match(regex, "example.com") is not None) # False
답변
사실 이것이 최선의 방법이라고 생각합니다.
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
val = URLValidator(verify_exists=False)
try:
val('http://www.google.com')
except ValidationError, e:
print e
사용자가 설정 한 경우 verify_exists
에 True
, 실제로, URL이 존재하는지 확인합니다 올바르게 형성된 것, 그렇지 않으면 그냥 확인합니다.
편집 : 아 예,이 질문은 이것의 중복입니다 : URL이 Django의 유효성 검사기에 존재하는지 어떻게 확인할 수 있습니까?
답변
사용 유효성 검사기의 패키지를 :
>>> import validators
>>> validators.url("http://google.com")
True
>>> validators.url("http://google")
ValidationFailure(func=url, args={'value': 'http://google', 'require_tld': True})
>>> if not validators.url("http://google"):
... print "not valid"
...
not valid
>>>
pip ( )를 사용 하여 PyPI에서 설치합니다 pip install validators
.
답변
@DMfll 답변을 기반으로 한 참 또는 거짓 버전 :
try:
# python2
from urlparse import urlparse
except:
# python3
from urllib.parse import urlparse
a = 'http://www.cwi.nl:80/%7Eguido/Python.html'
b = '/data/Python.html'
c = 532
d = u'dkakasdkjdjakdjadjfalskdjfalk'
def uri_validator(x):
try:
result = urlparse(x)
return all([result.scheme, result.netloc, result.path])
except:
return False
print(uri_validator(a))
print(uri_validator(b))
print(uri_validator(c))
print(uri_validator(d))
제공 :
True
False
False
False
답변
요즘 나는 Padam의 대답에 따라 다음을 사용합니다.
$ python --version
Python 3.6.5
그리고 이것이 어떻게 보이는지 :
from urllib.parse import urlparse
def is_url(url):
try:
result = urlparse(url)
return all([result.scheme, result.netloc])
except ValueError:
return False
사용하십시오 is_url("http://www.asdf.com")
.
도움이 되었기를 바랍니다.
답변
참고 -lepl은 더 이상 지원되지 않습니다. 죄송합니다 (사용을 환영하며 아래 코드가 작동한다고 생각하지만 업데이트를받지는 않습니다).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html 은이 를 수행하는 방법을 정의합니다 (http URL 및 이메일 용). 나는 lepl (파서 라이브러리)을 사용하여 파이썬에서 권장 사항을 구현했습니다. 참조 http://acooke.org/lepl/rfc3696.html를
쓰다:
> easy_install lepl
...
> python
...
>>> from lepl.apps.rfc3696 import HttpUrl
>>> validator = HttpUrl()
>>> validator('google')
False
>>> validator('http://google')
False
>>> validator('http://google.com')
True
답변
문자열을 “유효한”URL로 확인하는 건전한 방법을 알아 내려고이 페이지를 방문했습니다. python3을 사용하여 여기에 내 솔루션을 공유합니다. 추가 라이브러리가 필요하지 않습니다.
python2를 사용하는 경우 https://docs.python.org/2/library/urlparse.html을 참조 하십시오 .
python3을 그대로 사용하는 경우 https://docs.python.org/3.0/library/urllib.parse.html을 참조 하십시오 .
import urllib
from pprint import pprint
invalid_url = 'dkakasdkjdjakdjadjfalskdjfalk'
valid_url = 'https://stackoverflow.com'
tokens = [urllib.parse.urlparse(url) for url in (invalid_url, valid_url)]
for token in tokens:
pprint(token)
min_attributes = ('scheme', 'netloc') # add attrs to your liking
for token in tokens:
if not all([getattr(token, attr) for attr in min_attributes]):
error = "'{url}' string has no scheme or netloc.".format(url=token.geturl())
print(error)
else:
print("'{url}' is probably a valid url.".format(url=token.geturl()))
ParseResult (scheme = ”, netloc = ”, path = ‘dkakasdkjdjakdjadjfalskdjfalk’, params = ”, query = ”, fragment = ”)
ParseResult (scheme = ‘https’, netloc = ‘stackoverflow.com’, path = ”, params = ”, query = ”, fragment = ”)
‘dkakasdkjdjakdjadjfalskdjfalk’문자열에는 체계 또는 netloc이 없습니다.
‘ https://stackoverflow.com ‘은 아마도 유효한 URL 일 것입니다.
다음은 더 간결한 기능입니다.
from urllib.parse import urlparse
min_attributes = ('scheme', 'netloc')
def is_valid(url, qualifying=min_attributes):
tokens = urlparse(url)
return all([getattr(tokens, qualifying_attr)
for qualifying_attr in qualifying])