在Python中验证URL

在Python中验证URL,python,url,url-validation,Python,Url,Url Validation,我一直在试图找出验证URL的最佳方法是什么(特别是在Python中),但还没有真正找到答案。似乎没有一种已知的方法来验证URL,这取决于您认为可能需要验证的URL。同样,我发现很难找到一个易于阅读的URL结构标准。我确实找到了RFC 3986和3987,但它们所包含的远不止是它的结构 我是否遗漏了什么,或者没有一种标准的方法来验证URL?这看起来可能是URL的副本 您应该能够使用此处描述的urlparse库 >>> from urllib.parse import urlpar

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


我是否遗漏了什么,或者没有一种标准的方法来验证URL?

这看起来可能是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='')

对要检查的字符串调用
urlparse
,然后确保
ParseResult
具有
scheme
netloc
的属性。假设您使用的是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=…”上没有错误,则url是有效的。

我将使用validators包。以下是有关文档和安装说明的详细信息

这就像

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

如果是,它将返回true,如果不是,则返回false。

您还可以尝试使用
urllib.request
通过在
urlopen
函数中传递URL并捕获
urleror
的异常来验证

from urllib.request import urlopen, URLError

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

这将
返回False
在这种情况下

原来的问题有点老了,但您可能还想看看我几个月前发布的库。它包括基于正则表达式的高性能URL验证,以符合RFC标准。一些细节:

  • 针对Python 2.7、3.4、3.5、3.6、3.7和3.8进行测试
  • 对Python3.x没有依赖关系,Python2.x中有一个条件依赖关系(替换Python2.x的bug
    re
    模块)
  • 单元测试涵盖100多个不同的成功/失败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)

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'

此外,它还包括大约60多个其他验证器,包括IP地址(IPv4和IPv6)、域和电子邮件地址,因此人们可能会发现一些有用的东西。

你在问什么?您想知道域的格式是否正确吗?您的代码在哪里?只有当主机具有internet连接时,此代码才可能重复,这可能并不总是正确的。最好不要使用internet连接来确定URL是否有效。同样使用Python2.7,应该在原始问题中指定。您可能希望使用
rfc3987
()或对URL解析结果进行更多处理。urlparse实际上不会将netloc验证为“internet url”--我也被它咬了一口`urlparse(')将为您提供一个netloc+方案。它看起来确实是一个更严格的解析器,但是
rfc3987
也允许通过这两种情况(
999.999.999.999
http://examplecom
)。在python3
import urllib.parse as urlprase
@gies0r中,这可能是来自urllib.parse import urlprase的
,因为上面的代码导入了整个解析模块,所以“x://a.bc.1”是一个有效的URL(scheme='x',netloc a.bc.1'),而apple.de不是(scheme=''',netloc='!?不太实用…这看起来是一个非常好的包。我还没有试过,但它应该得到超过0票的支持:-)。这只适用于域名-但它似乎不喜欢ip地址。proxy.remote.http:“”不是url。proxy.remote.https:“”不是url。请注意,我确实理解您的确切意思。值
XX.XXX.X.XXX:XXXX
将永远无法正确验证,因为a)它没有有效的协议,并且b)端口(
:XXXX
)未表示为有效的端口地址。如果您尝试验证
http://XX.XXX.X.XXX:1234
将正确验证。如果您尝试验证IP
http://123.165.43.12:1234
也将进行验证。您遇到的确切问题是什么?还有一个后续问题:有一些特殊的IP地址(如
127.0.0.1
0.0.0
)被RFC视为URL和IP地址的特殊情况。默认情况下,它们将无法通过验证。但是,您可以通过将
allow\u special\u ips=True
参数传递给验证器函数来允许它们(通过验证)。文档中有更多详细信息。当您的工作机器没有internet连接时,这是否有效?以下内容无法打印(validators.url(“apple.com”)@Larytet,因为这不是一个有效的url。但是,我发现了一个验证程序失败的案例。https://seekingalpha.com/article/4353927/track?type=cli…traºnner\u utm\uu。。。。未检测到使用“…”删除额外内容,并且验证程序返回True。事实上,这个URL是无效的