首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从URL提取顶级域名(TLD)

如何从URL提取顶级域名(TLD)
EN

Stack Overflow用户
提问于 2009-07-01 01:42:04
回答 8查看 76K关注 0票数 59

如何从URL中提取域名,不包括任何子域?

我最初的简单尝试是:

代码语言:javascript
复制
'.'.join(urlparse.urlparse(url).netloc.split('.')[-2:])

这适用于http://www.foo.com,但不适用于http://www.foo.com.au。有没有一种方法可以在不使用有效TLD(顶级域)或国家代码(因为它们会改变)的特殊知识的情况下正确地做到这一点。

谢谢

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-07-01 01:48:50

不,没有“内在”的方法知道(例如) zap.co.it是一个子域(因为意大利的注册商确实出售诸如co.it之类的域名),而zap.co.uk不是(因为英国的注册商不出售诸如co.uk之类的域名,而只是像zap.co.uk一样)。

您只需使用一个辅助表(或在线来源)来告诉您哪些TLD的行为与英国和澳大利亚的TLD非常相似--如果只是盯着字符串看,而没有这种额外的语义知识(当然,它最终可能会发生变化,但如果您能找到一个好的在线来源,人们希望它也会相应地改变!)。

票数 52
EN

Stack Overflow用户

发布于 2011-09-12 21:46:06

在看到这个问题后,有人写了一个很棒的python模块来解决这个问题:https://github.com/john-kurkowski/tldextract

该模块在由Mozilla志愿者管理的Public Suffix List中查找TLD

引用:

另一方面,根据Public Suffix List

tldextract通过查找当前存活的顶级域名,了解所有通用顶级域名和ccTLD国家代码顶级域名的外观。因此,给定一个网址,它就可以知道它的子域与它的域,它的域与它的国家代码。

票数 57
EN

Stack Overflow用户

发布于 2009-07-01 15:23:53

使用someone else在Mozilla网站上找到的this file of effective tlds

代码语言:javascript
复制
from __future__ import with_statement
from urlparse import urlparse

# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tld_file:
    tlds = [line.strip() for line in tld_file if line[0] not in "/\n"]

def get_domain(url, tlds):
    url_elements = urlparse(url)[1].split('.')
    # url_elements = ["abcde","co","uk"]

    for i in range(-len(url_elements), 0):
        last_i_elements = url_elements[i:]
        #    i=-3: ["abcde","co","uk"]
        #    i=-2: ["co","uk"]
        #    i=-1: ["uk"] etc

        candidate = ".".join(last_i_elements) # abcde.co.uk, co.uk, uk
        wildcard_candidate = ".".join(["*"] + last_i_elements[1:]) # *.co.uk, *.uk, *
        exception_candidate = "!" + candidate

        # match tlds: 
        if (exception_candidate in tlds):
            return ".".join(url_elements[i:]) 
        if (candidate in tlds or wildcard_candidate in tlds):
            return ".".join(url_elements[i-1:])
            # returns "abcde.co.uk"

    raise ValueError("Domain not in global list of TLDs")

print get_domain("http://abcde.co.uk", tlds)

结果如下:

代码语言:javascript
复制
abcde.co.uk

如果有人告诉我上面的哪些部分可以用一种更具蟒蛇风格的方式重写,我将不胜感激。例如,肯定有更好的方法遍历last_i_elements列表,但我想不到。我也不知道ValueError是不是最好的选择。评论?

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1066933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档