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 validatorspip 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.schemeresult.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 
Interesting Posts