从主机名中提取域名
有没有一种编程的方法可以从给定的主机名中找到域名?
比如说,给定的是 -> www.yahoo.co.jp,返回的应该是 -> yahoo.co.jp。
一种可行但很慢的方法是:
把字符串按“.”分开,然后从左边去掉一个部分,最后把剩下的部分合并起来,并使用dnspython查询一个SOA记录。当返回一个有效的SOA记录时,就可以认为那是一个域名。
有没有更简单、更快的方法来做到这一点,而不使用正则表达式?
3 个回答
1
你的算法是对的。因为区域切割在域名中不会显示出来(你能看到域名中的点,但看不到区域切割),所以这是唯一正确的方式。
一种近似的算法是使用一个区域列表,就像Alnitak提到的那样。记住,这些静态列表并不是权威的,它们缺少很多注册信息,而且可能已经过时了等等。
4
你可以用 partition
来代替 split
:
>>> 'www.yahoo.co.jp'.partition('.')[2]
'yahoo.co.jp'
这样做可以帮助你解析字符串,但显然它不会检查返回的字符串是否是一个有效的域名。
16
其实,"域名"和"主机名"之间的关系并没有一个简单明了的定义。
你现在的方法是从树的顶端往下找,直到看到一个SOA
记录,这种做法是最正确的。
从技术上讲,你在找的是一个“区域切割”,在大多数情况下,这个切割点就是域名从顶级域名(TLD)被委托出去的地方。
如果你只是通过简单的文本解析主机名,而不参考DNS,那这个方法基本上是行不通的。
另外,你可以使用一些集中维护的域名委托列表,这些列表可以在http://publicsuffix.org/找到,但要注意,这些列表可能不完整或者过时。
你也可以看看这个问题,里面也讨论过这些内容……