【问题标题】:Removing subdomains from string domain name [duplicate]从字符串域名中删除子域[重复]
【发布时间】:2023-04-02 08:35:01
【问题描述】:

所以我编写了一个小函数来从输入域字符串中删除子域(如果有):

def rm(text):
    print(text.replace(text, '.'.join(text.split('.')[-2:])), end="")
    print("\n")

if __name__ == "__main__":
    rm("me.apple.com")
    rm("not.me.apple.com")
    rm("really.not.me.apple.com")
    # problem here
    rm("bbc.co.uk")

在您拥有 .something.something tld. 之前,一切正常,例如 .co.uk.co.in

所以我的输出是:

apple.com
apple.com
apple.com
--> co.uk

它应该在哪里,

apple.com
apple.com
apple.com
bbc.co.uk

如何以优雅的方式修复/创建函数,而不是检查所有可能的双 tld? 编辑:如果这很重要,我将不得不检查数百万个域。所以我要做的就是将一个域传递给我的函数并获得一个干净的、无子域的域。

【问题讨论】:

  • @StephenRauch 一个函数。可能很快,因为我会从一个包含 100 万个域的列表中一次传递一个域。
  • 没有其他办法。 co.uk 不是有效域,但 co.de 是。因此,foo.co.uk 将减少到 foo.co.uk,但 foo.co.de 应该变成 co.de。有一些库可以处理所有这些特殊情况。
  • @Blender 我的想法完全正确!这就是我卡住的原因!顺便说一句,你能命名这些库吗?

标签: python


【解决方案1】:

你不能。不是没有查询某种服务——至少是 DNS——或者在你的函数中编码一个答案数据库。

为什么不呢?因为你无法用语言准确地描述你想要做什么。例如,“me.apple.com”应解析为“apple.com”,“me.apple.co.uk”应解析为“apple.co.uk”,但“a.b.c.d.e”应解析为什么?除非这些示例是按照其内容建议(但仍未定义)正确答案的方式精心挑选的,否则无法知道。

一旦你提出算法的文字描述,它就可以实现。

您可以使用“whois”服务来完成繁重的工作:https://www.whois.com/whois/ - 如果您愿意发出 HTTP 请求,这可以满足您的需求。

【讨论】:

  • 猜到了 :(。任何理解这一点的库都不需要 dnspython 来单独查询,因为这太昂贵且耗时。
【解决方案2】:

tldextrat 包应该为您完成繁重的工作,基于公共后缀列表。它不是防弹的,但应该适用于所有合理的用例:

import tldextract
def rm(text):
    return tldextract.extract(text).registered_domain

【讨论】:

  • 这样做了:ext = tldextract.extract(domain_with_subdomain); return ext.registered_domain
  • @Jeet.Deir 完全忘记了那个!绝对比我最初的建议简单。已编辑和修复。
猜你喜欢
  • 2013-04-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多