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

5 投票
1 回答
5575 浏览
提问于 2025-04-18 13:01

我需要在Python中验证一个网址,并确保它的主机部分(也叫netloc)是一个域名或者IPv4/IPv6地址。

大多数关于这个话题的StackOverflow问答都说“只需使用urlparse”。但在这种情况下,这个方法并不适用。

我已经用urlparse验证过我确实有一个网址。

问题是,我需要进一步验证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

但我经常会遇到一些拼写错误,这些错误会让格式不正确的网址通过验证。比如,有人可能会不小心漏掉域名中的一个'.':

>>> ## 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

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

撰写回答