从主机名中提取域名

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 提到的那样。请记住,这些静态列表不具有权威性,它们缺少许多注册表,它们已经过时等等。

【讨论】:

以上是关于从主机名中提取域名的主要内容,如果未能解决你的问题,请参考以下文章

如何获取网页的url

System.Net.Mail 创建无效的电子邮件和 eml 文件?在主机名中插入额外的点

如何使用jquery从url中提取主机名[重复]

从 URL 获取域名/主机名的最快方法是啥?

如何在 JavaScript 中提取 URL 的主机名部分

将子域转换为域名(子 TLD 与 TLD)