urlparse不会引发无效网址的异常

时间:2019-05-09 16:47:30

标签: python python-3.x urllib

我有以下代码,应该检查输入的网址是否有效:

#!/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的有效性?

2 个答案:

答案 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