Python - 验证一个URL是否具有域名或IP地址

5
我需要在Python中验证一个URL,并确保其中的host/netloc组件是域名或IPv4/v6地址。
大多数关于此主题的StackOverflow Q&A建议“只需使用urlparse”。但这不能适用于这种情况。
我已经使用urlparse验证了我确实拥有一个URL。
问题是我需要进一步验证从urlparse获取的.netloc,以确保我获得的是域名或IP地址,而不仅仅是主机名。
让我举个例子:
>>> from urlparse import urlparse

这个按预期/期望工作:
>>> ## domain name
>>> print urlparse("http://example.com").netloc
example.com

>>> ## ipv4
>>> print urlparse("http://255.255.255.255").netloc
255.255.255.255

>>> ## acceptable hostname
>>> print urlparse("http://localhost").netloc
localhost

但我经常遇到错别字,会导致格式错误的URL通过。 某人可能会在域名中意外地漏掉一个“.”:

>>> ## valid hostname, but unacceptable
>>> print urlparse("http://examplecom").netloc
examplecom

"

examplecom是一个有效的主机名,可以存在于网络中,但它不是一个有效的域名。

此外,似乎没有强制执行IP地址的规则:

"
>>> print urlparse("http://266.266.266.266").netloc
266.266.266.266

>>> print urlparse("http://999.999.999.999.999").netloc
999.999.999.999.999

http://999.999.999.999.999 是一个有效的地址。如果你想查看一个域名是否存在,你可以进行DNS查询。https://dev59.com/wHE85IYBdhLWcg3wYSZk - drum
根据第一句中我所注明的要求,999.999.999.999.999 不符合 IPv4 或 IPv6 标准的有效地址。 - Jonathan Vanasco
1个回答

5
我认为这是您想要的功能:

我认为这符合您的需求:

import socket
def good_netloc(netloc):
    try:
        socket.gethostbyname(netloc)
        return True
    except:
        return False

print good_netloc("google.com")
print good_netloc("googlecom")
print good_netloc("10.1.1.1")
print good_netloc("999.999.999.999")

这段代码的输出结果是:
lap:~$ python tmp.py
True
False
True
False

谢谢。这可以在许多情况下完成工作,但并非所有情况都适用。socket.gethostbyname 依赖于 DNS 查询,因此计算机必须连接到互联网。它还验证给定的域名是否具有活动的 DNS 记录--因此,“一旦激活”或“未来”的域名都会失败(即 example.com 可通过,但 foo.example.com 会失败)。 - Jonathan Vanasco
它使用解析顺序,因此它显示名称当前是否有效。(如果您将主机添加到/etc/hosts文件中,则会使用该文件。)我不确定我是否理解了您关于“一旦活动或未来”的评论。您是说您希望它对任何可能(但不一定当前)是有效DNS名称的内容返回True吗? - John Hazen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接