如何从URL中提取域名,不包括任何子域?
我最初的简单尝试是:
'.'.join(urlparse.urlparse(url).netloc.split('.')[-2:])这适用于http://www.foo.com,但不适用于http://www.foo.com.au。有没有一种方法可以在不使用有效TLD(顶级域)或国家代码(因为它们会改变)的特殊知识的情况下正确地做到这一点。
谢谢
发布于 2009-07-01 01:48:50
不,没有“内在”的方法知道(例如) zap.co.it是一个子域(因为意大利的注册商确实出售诸如co.it之类的域名),而zap.co.uk不是(因为英国的注册商不出售诸如co.uk之类的域名,而只是像zap.co.uk一样)。
您只需使用一个辅助表(或在线来源)来告诉您哪些TLD的行为与英国和澳大利亚的TLD非常相似--如果只是盯着字符串看,而没有这种额外的语义知识(当然,它最终可能会发生变化,但如果您能找到一个好的在线来源,人们希望它也会相应地改变!)。
发布于 2011-09-12 21:46:06
在看到这个问题后,有人写了一个很棒的python模块来解决这个问题:https://github.com/john-kurkowski/tldextract
该模块在由Mozilla志愿者管理的Public Suffix List中查找TLD
引用:
另一方面,根据Public Suffix List,
tldextract通过查找当前存活的顶级域名,了解所有通用顶级域名和ccTLD国家代码顶级域名的外观。因此,给定一个网址,它就可以知道它的子域与它的域,它的域与它的国家代码。
发布于 2009-07-01 15:23:53
使用someone else在Mozilla网站上找到的this file of effective tlds:
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)结果如下:
abcde.co.uk如果有人告诉我上面的哪些部分可以用一种更具蟒蛇风格的方式重写,我将不胜感激。例如,肯定有更好的方法遍历last_i_elements列表,但我想不到。我也不知道ValueError是不是最好的选择。评论?
https://stackoverflow.com/questions/1066933
复制相似问题