是否有一种编程方式可以从给定的主机名中查找域名?
给定 -> www.yahoo.co.jp 返回 -> yahoo.co.jp
有效但非常缓慢的方法是:
拆分“。” 并从左侧删除 1 个组,当返回有效的 SOA 记录时,使用 dnspython 加入和查询 SOA 记录,考虑一个域
在不使用正则表达式的情况下,是否有更清洁/更快的方法来做到这一点?
对于哪个“域名”是任何特定“主机名”的父级,没有简单的定义。
您当前遍历树直到看到SOA
记录的方法实际上是最正确的。
从技术上讲,您正在做的是找到“区域切割”,并且在绝大多数情况下,这将对应于从其 TLD 委派域的点。
任何仅依赖于主机名文本解析而不参考 DNS 的方法都注定要失败。
或者,使用来自http://publicsuffix.org/的以委托为中心的域的集中维护列表,但要注意这些列表可能不完整和/或过时。
另请参阅这个问题,所有这些都已在之前完成...
您可以使用partition
代替split
:
>>> 'www.yahoo.co.jp'.partition('.')[2]
'yahoo.co.jp'
这将有助于解析,但显然不会检查返回的字符串是否是有效域。
你的算法是正确的。由于区域切割不反映在域名中(您会看到域切割 - 点 - 但不是区域切割),它是唯一正确的。
一种近似算法是使用区域列表,就像 Alnitak 提到的那样。请记住,这些静态列表不具有权威性,它们缺少许多注册表,它们是陈旧的,等等。