[python] 파이썬-파이썬에서 URL의 유효성을 검사하는 방법은 무엇입니까? (변형 여부)

나는 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_existsTrue, 실제로, 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])