验证Python中的URL

mp9*_*p94 14 python url url-validation

我一直试图弄清楚验证URL的最佳方法是什么(特别是在Python中),但实际上并没有找到答案.似乎没有一种已知的方法来验证URL,这取决于您认为可能需要验证的URL.同样,我发现很难找到易于阅读的URL结构标准.我确实找到了RFC 3986和3987,但它们包含的不仅仅是它的结构.

我错过了什么,或者没有一种标准方法来验证URL?

bgs*_*ler 23

这看起来可能与如何在Python中使用正则表达式验证URL有关?

您应该能够使用urlparse那里描述的库.

>>> from urllib.parse import urlparse # python2: from urlparse import urlparse
>>> urlparse('actually not a url')
ParseResult(scheme='', netloc='', path='actually not a url', params='', query='', fragment='')
>>> urlparse('http://google.com')
ParseResult(scheme='http', netloc='google.com', path='', params='', query='', fragment='')
Run Code Online (Sandbox Code Playgroud)

调用urlparse要检查的字符串,然后确保ParseResult具有scheme和的属性netloc

  • 您可能想使用`rfc3987`(https://pypi.python.org/pypi/rfc3987)或对urlparse结果进行更多处理.urlparse实际上不会将netloc验证为"互联网网址" - 我也被它咬了.`urlparse('http:// invalidurl')会给你一个netloc +方案. (5认同)
  • 在 python3 中 `import urllib.parse as urlparse` (2认同)

Chr*_*ski 11

最初的问题有点旧,但您可能还想查看我几个月前发布的Validator-Collection库.它包括基于高性能的基于正则表达式的URL验证,以符合RFC标准.一些细节:

  • 针对Python 2.7,3.4,3.5,3.6进行了测试
  • 没有依赖Python 3.x,Python 2.x中的一个条件依赖(Python 2.x的buggy re模块的替代品)
  • 单元测试涵盖约80种不同的成功/失败URL模式,包括非标准字符等.尽可能接近覆盖RFC标准的全部范围,正如我所能找到的那样.

它也很容易使用:

from validator_collection import validators, checkers

checkers.is_url('http://www.stackoverflow.com')
# Returns True

checkers.is_url('not a valid url')
# Returns False

value = validators.url('http://www.stackoverflow.com')
# value set to 'http://www.stackoverflow.com'

value = validators.url('not a valid url')
# raises a validator_collection.errors.InvalidURLError (which is a ValueError)
Run Code Online (Sandbox Code Playgroud)

此外,Validator-Collection还包含大约60多个其他验证器,包括域和电子邮件地址,因此人们可能会觉得有用.