在Python中验证URL

19 投票
5 回答
58346 浏览
提问于 2025-04-17 21:12

我一直在想,验证一个网址(特别是在Python中)最好的方法是什么,但一直找不到答案。看起来没有一种公认的方法来验证网址,这其实取决于你想验证哪些网址。此外,我发现很难找到一个简单易懂的网址结构标准。我找到了RFC 3986和3987这两个文档,但里面的内容远不止网址的结构。

我是不是漏掉了什么,还是说根本就没有一种标准的方法来验证网址呢?

5 个回答

-1

假设你在使用Python 3,你可以用urllib这个库。代码大概是这样的:

import urllib.request as req
import urllib.parse as p

def foo():
    url = 'http://bar.com'
    request = req.Request(url)
    try:
        response = req.urlopen(request)
        #response is now a string you can search through containing the page's html
    except:
        #The url wasn't valid

如果在“response = ...”这一行没有出错,那说明这个网址是有效的。

1

你也可以试试用 urllib.request 来验证网址。具体做法是把网址放进 urlopen 函数里,然后捕捉 URLError 这个错误。

from urllib.request import urlopen, URLError

def validate_web_url(url="http://google"):
    try:
        urlopen(url)
        return True
    except URLError:
        return False

在这种情况下,这样做会 返回 False

1

我建议你使用validators这个包。这里有一个链接,里面有使用说明和安装步骤。

使用起来非常简单,就像这样:

import validators
url = 'YOUR URL'
validators.url(url)

如果验证通过,它会返回true(真),如果不通过,就返回false(假)。

22

这个问题虽然有点旧,但你可能也想看看我几个月前发布的Validator-Collection库。这个库可以高效地用正则表达式来验证网址,确保它们符合RFC标准。以下是一些细节:

  • 已经在Python 2.7、3.4、3.5、3.6、3.7和3.8上测试过。
  • 在Python 3.x上没有依赖,Python 2.x上有一个条件依赖(可以替代Python 2.x中有问题的re模块)。
  • 有单元测试覆盖了100多种不同的成功/失败的网址模式,包括一些非标准字符等。尽量覆盖了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)

value = validators.url('https://123.12.34.56:1234')
# value set to 'https://123.12.34.56:1234'

value = validators.url('http://10.0.0.1')
# raises a validator_collection.errors.InvalidURLError (which is a ValueError)

value = validators.url('http://10.0.0.1', allow_special_ips = True)
# value set to 'http://10.0.0.1'

此外,Validator-Collection还包含了大约60个其他的验证器,包括IP地址(IPv4和IPv6)、域名和电子邮件地址等,大家可能会觉得很有用。

27

这看起来可能和这个问题重复了:如何用正则表达式在Python中验证一个网址?

你可以使用那里的 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='')

对你想检查的字符串调用 urlparse,然后确保 ParseResultschemenetloc 这两个属性。

撰写回答