从主机名中提取域名
Posted
技术标签:
【中文标题】从主机名中提取域名【英文标题】:Extract domain name from a host name 【发布时间】:2010-10-23 23:10:47 【问题描述】:有没有一种程序化的方法可以从给定的主机名中找到域名?
给定-> www.yahoo.co.jp 返回 -> yahoo.co.jp
有效但速度很慢的方法是:
拆分为“.”并从左侧删除 1 个组,使用 dnspython 加入和查询 SOA 记录 当返回一个有效的 SOA 记录时,考虑一个域
在不使用正则表达式的情况下,有没有更清洁/更快的方法?
【问题讨论】:
虽然有多个子域,但也并不总是有效:sample.sample2.yahoo.com.jp @Micky McQuade:如果在循环中完成,这是定位域名的唯一方法。 你的算法是合理的。但修正你的术语:www.yahoo.co.jp 是一个域名,以及一个主机名。您正在寻找区域。 【参考方案1】:您可以使用partition
代替split
:
>>> 'www.yahoo.co.jp'.partition('.')[2]
'yahoo.co.jp'
这将有助于解析,但显然不会检查返回的字符串是否为有效域。
【讨论】:
该字符串将始终是一个有效的域,但不能保证它将是一个区域。【参考方案2】:对于哪个“域名”是任何特定“主机名”的父级没有简单的定义。
您当前遍历树直到看到SOA
记录的方法实际上是最正确的。
从技术上讲,您所做的是找到“区域切割”,并且在绝大多数情况下,这将对应于从其 TLD 委派域的点。
任何仅依赖于主机名文本解析而不参考 DNS 的方法都注定要失败。
或者,使用来自 http://publicsuffix.org/ 的集中维护的以委派为中心的域列表,但请注意这些列表可能不完整和/或过时。
另请参阅 this question 之前所有这些都已完成...
【讨论】:
你能解释一下这个问题和你的答案吗?我不确定发生了什么。 一个 zone 必须有一个 SOA 记录,但是您可以在一个 zone 下有许多级别的“标签”。如果你有 a.b.c.d.example.com,唯一知道实际区域是 example.com 的方法是依次剥离每个标签,直到找到 SOA 记录。【参考方案3】:您的算法是正确的。由于区域切割不反映在域名中(您会看到域切割 - 点 - 但不是区域切割),它是唯一正确的。
近似算法是使用区域列表,就像 Alnitak 提到的那样。请记住,这些静态列表不具有权威性,它们缺少许多注册表,它们已经过时等等。
【讨论】:
以上是关于从主机名中提取域名的主要内容,如果未能解决你的问题,请参考以下文章