我有以下代码,应该检查输入的网址是否有效:
#!/usr/bin/env python3
import sys
import urllib.parse
# ...
def checkValidURL(someURL):
try:
parsed_url = urllib.parse.urlparse(someURL)
isURL = True
except ValueError:
print("Invalid URL!")
sys.exit(0)
# ...
if __name__ == "__main__":
checkValidURL(someURL)
如果输入了无效的URL,例如:someURL="http://ijfjiör@@@a:43244434::"
,则应按照here的描述引发ValueError
:
netloc属性中的字符在NFKC规范下(由IDNA编码使用)分解为/,?,#,@或:中的任何一个,将引发ValueError。如果在解析之前将URL分解,则不会引发错误。
但是,不会引发任何异常,并且该URL似乎有效。
我做错了什么吗,还是有其他方法可以检查URL的有效性?
答案 0 :(得分:3)
您的URL不会分解为包含禁止字符的字符串,因此此处的引号根本不相关。
引号中的语言严格来说是禁止使用http://xn--foo/
之类的internationalized domain name encoding来生成http://?/
之类的内容,并且由于您不在此处进行操作,因此没有ValueError
产生或确实可以预期。
(抱歉,不在我可以创建真实的工作示例的地方。)
答案 1 :(得分:0)
我不确定python validators module是否更适合您的用例?
$ python3
>>>
>>>
>>> import validators
>>>
>>> validators.url("http://ijfjiör@@@a:43244434::")
ValidationFailure(func=url, args={'value': 'http://ijfjiör@@@a:43244434::', 'public': False})
>>>
>>> validators.url("http://www.google.com:8080/")
True
>>>
>>> validators.url("http://www.我愛你.com:8080/你好")
True