从域中提取二级域? - Python

Posted

技术标签:

【中文标题】从域中提取二级域? - Python【英文标题】:Extract 2nd level domain from domain? - Python 【发布时间】:2011-06-22 11:02:27 【问题描述】:

我有一个域列表,例如

site.co.uk

site.com

site.me.uk

site.jpn.com

site.org.uk

site.it

域名也可以包含 3 级和 4 级域,例如

test.example.site.org.uk

test2.site.com

我需要尝试提取二级域,在所有这些情况下都是site


有什么想法吗? :)

【问题讨论】:

大致类似于:***.com/questions/1066933/… 【参考方案1】:

没有办法可靠地得到它。子域是任意的,并且每天都有一个庞大的域扩展列表。最好的情况是您检查域名扩展的怪物列表并维护该列表。

列表: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

【讨论】:

怪物列表在哪里? :| mxr.mozilla.org/mozilla-central/source/netwerk/dns/… 谢谢!如果您可以将该列表放入您的答案中,我将很乐意勾选它! :) 这是 Mozilla 列表的公众形象:publicsuffix.org。另见:github.com/john-kurkowski/tldextract【参考方案2】:

遵循@kohlehydrat 的建议:

import urllib2

class TldMatcher(object):
    # use class vars for lazy loading
    MASTERURL = "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1"
    TLDS = None

    @classmethod
    def loadTlds(cls, url=None):
        url = url or cls.MASTERURL

        # grab master list
        lines = urllib2.urlopen(url).readlines()

        # strip comments and blank lines
        lines = [ln for ln in (ln.strip() for ln in lines) if len(ln) and ln[:2]!='//']

        cls.TLDS = set(lines)

    def __init__(self):
        if TldMatcher.TLDS is None:
            TldMatcher.loadTlds()

    def getTld(self, url):
        best_match = None
        chunks = url.split('.')

        for start in range(len(chunks)-1, -1, -1):
            test = '.'.join(chunks[start:])
            startest = '.'.join(['*']+chunks[start+1:])

            if test in TldMatcher.TLDS or startest in TldMatcher.TLDS:
                best_match = test

        return best_match

    def get2ld(self, url):
        urls = url.split('.')
        tlds = self.getTld(url).split('.')
        return urls[-1 - len(tlds)]


def test_TldMatcher():
    matcher = TldMatcher()

    test_urls = [
        'site.co.uk',
        'site.com',
        'site.me.uk',
        'site.jpn.com',
        'site.org.uk',
        'site.it'
    ]

    errors = 0
    for u in test_urls:
        res = matcher.get2ld(u)
        if res != 'site':
            print "Error: found '0', should be 'site'".format(res)
            errors += 1

    if errors==0:
        print "Passed!"
    return (errors==0)

【讨论】:

【参考方案3】:

使用 python tld

https://pypi.python.org/pypi/tld

$ pip install tld

from tld import get_tld, get_fld

print(get_tld("http://www.google.co.uk"))
'co.uk'

print(get_fld("http://www.google.co.uk"))
'google.co.uk'

【讨论】:

【参考方案4】:

混合提取 1 级和 2 级的问题。

简单的解决方案...

建立可能的网站后缀列表,从小到大排列。 “co.uk”、“uk”、“co.jp”、“jp”、“com”

并检查,可以在域末尾匹配后缀。如果匹配,则下一部分是网站。

【讨论】:

【参考方案5】:

唯一可能的方法是通过一个包含所有可能***域(如 .com 或 co.uk)的列表。然后,您将浏览此列表并结帐。我没有看到任何其他方式,至少在运行时不访问互联网。

【讨论】:

您需要该列表,即使在运行时访问 Internet。向最终用户出售三级域或二级域的决定由 CCTLD 的权威机构做出。我认为有些人甚至保留了一些二级域名,并在这些域名和其他地方出售二级域名。当然,您还需要维护该列表,因为这些事情确实会发生变化(而且那是在您考虑创建新的 CCTLD 之前) 谢谢!知道我可以在哪里获取列表吗?感觉像是不可能完成的任务:S【参考方案6】:

@休博斯韦尔

在您的示例中,您处理的不是特殊域,例如议会.uk,它们在文件中用“!”表示(例如!parliament.uk)

我对你的代码做了一些修改,也让它看起来更像我以前使用的 php 函数。

还增加了从本地文件加载数据的可能性。

还用一些域进行了测试,例如:

niki.bg,niki.1.bg parliament.uk niki.at、niki.co.at niki.us,niki.ny.us niki.museum, niki.national.museum www.niki.uk - 由于 Mozilla 文件中的“*”,报告为 OK。

请随时与我联系@github,以便我可以将您添加为那里的共同作者。

GitHub 仓库在这里:

https://github.com/nmmmnu/TLDExtractor/blob/master/TLDExtractor.py

【讨论】:

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

python二级练习和考试复习(将复数2.3103-1.3410-3j赋值给变量A,并分别提取A的实部和虚部。)

模拟两个域之间的用户

什么是二级域名?二级域名如何注册申请?

如何使用 Python 获取域中的所有链接?

asp.net 模拟从域中的服务器到域外的服务器

.htaccess将www子域重定向到二级域