在Python中验证URL
我一直在想,验证一个网址(特别是在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
,然后确保 ParseResult
有 scheme
和 netloc
这两个属性。