Python的 – 如何validation在Python中的url? (格式不正确)
我有用户的url
,我不得不回复提取的HTML。
我如何检查URL是否格式错误?
例如 :
url='google' // Malformed url='google.com' // Malformed url='http://google.com' // Valid url='http://google' // Malformed
我们怎样才能做到这一点?
Django的urlvalidation正则expression式:
regex = re.compile( r'^(?:http|ftp)s?://' # http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[AZ]{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)
其实我觉得这是最好的方法
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
,它会实际validationURL是否存在,否则只检查它是否正确形成。
编辑:嗯,这个问题是这样的重复: 如何检查一个URL是否存在与Django的validation程序?
使用validation程序包:
>>> 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 pip install validators
( pip install validators
)。
基于@ DMfll的True或False版本的答案:
from urlparse 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 result.scheme and result.netloc and result.path except: return False print uri_validator(a) print uri_validator(b) print uri_validator(c) print uri_validator(d)
得到:
True True False True
注意 – lepl不再支持,对不起(欢迎您使用它,我认为下面的代码工作,但它不会得到更新)。
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html定义了如何做到这一点(httpurl和电子邮件)。; 我使用lepl(parsing器库)在python中实现了它的build议。 请参阅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
我登陆这个页面试图找出一个有效的方式来validationstring为“有效”的url。 我在这里分享我的解决scheme使用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'string没有scheme或netloc。
' https://stackoverflow.com '可能是一个有效的url。
这是一个更简洁的function:
import urllib min_attributes = ('scheme', 'netloc') def is_valid(url, qualifying=None): qualifying = min_attributes if qualifying is None else qualifying token = urllib.parse.urlparse(url) return all([getattr(token, qualifying_attr) for qualifying_attr in qualifying])
编辑正如@Kwame指出的那样,即使.com,.co不存在,代码也会validationurl。
这很简单,工作:
所以, min_attr
有一个基本的string,它需要用来定义URL,例如http://
part和google.com
部分。
urlparse.scheme
存储http://
和
urlparse.netloc
存储域名google.com
如果所有的variables返回true, all()
将返回true。 因此,如果result.scheme
和result.netloc
存在,则该URL是有效的,因此返回True
。
from urlparse import urlparse def url_check(url): min_attr = ('scheme' , 'netloc') try: result = urlparse(url) if all([result.scheme, result.netloc]): return True else: return False except: return False