我有一个域名列表,例如:
site.co.uk
site.com
site.me.uk
site.jpn.com
site.org.uk
site.it
而且这些域名包含第三和第四级域名,例如:
test.example.site.org.uk
test2.site.com
我需要尝试提取第二级域名,对于所有这些情况应为site
有什么想法? :)
我有一个域名列表,例如:
site.co.uk
site.com
site.me.uk
site.jpn.com
site.org.uk
site.it
而且这些域名包含第三和第四级域名,例如:
test.example.site.org.uk
test2.site.com
我需要尝试提取第二级域名,对于所有这些情况应为site
有什么想法? :)
无法可靠地获取它。子域是任意的,而且每天都会有一个庞大的域名扩展列表。最好的情况是您检查域名扩展的庞大列表并维护该列表。
列表: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
根据@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)
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'
混合提取1级和2级的问题。
简单的解决方案...
建立可能的站点后缀列表,按照从狭窄到常见的顺序排列。 "co.uk", "uk", "co.jp", "jp", "com"
然后检查,站点后缀是否可以匹配域名的末尾。如果匹配,则下一部分是站点。
@Hugh Bothwell
在您的示例中,您没有处理像 parliament.uk 这样的特殊域名,它们在文件中用 "!" 表示(例如 !parliament.uk)。
我对您的代码进行了一些更改,使其看起来更像我之前使用的 PHP 函数。
还添加了从本地文件加载数据的可能性。
还测试了一些域名,例如:
请随时通过 github 联系我,以便我可以将您添加为共同作者。
GitHub 存储库在此处:
https://github.com/nmmmnu/TLDExtractor/blob/master/TLDExtractor.py