Python - 验证URL是否有域名或IP地址
我需要在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