Python urlparse – 提取没有子域名的域名

需要一种方法来提取一个没有使用Python urlparse的url中的子域名的域名。

例如,我想从诸如"http://www.google.com"的完整url中提取"google.com" "http://www.google.com"

最接近的,我似乎来与urlparsenetloc属性,但包括子域名,在这个例子中是www.google.com

我知道可以编写一些自定义string操作来将www.google.com变成google.com,但是我想避免在这个任务中进行string转换或正则expression式。 (原因是我对URL形成规则不够熟悉,以至于我可以考虑编写自定义parsing函数时所需的每个边界案例。)

或者,如果urlparse不能做我所需要的,有没有人知道任何其他的Pythonurlparsing库呢?

你可能想要看看tldextract ,这是一个专门用来做这种事情的库。

它使用公共后缀列表来尝试在已知通用顶级域名(gTLD)基础上进行体面分割,但请注意,这只是一个powershell清单,没有什么特别之处,所以它可能会过时(尽pipe希望这样做是为了避免)。

 >>> import tldextract >>> tldextract.extract('http://forums.news.cnn.com/') ExtractResult(subdomain='forums.news', domain='cnn', suffix='com') 

所以在你的情况下:

 >>> extracted = tldextract.extract('http://www.google.com') >>> "{}.{}".format(extracted.domain, extracted.suffix) "google.com" 

这是一个更新,基于更新答案的赏金请求

首先使用tld包。 包装的描述:

从给定的URL中提取顶级域名(TLD)。 TLD名称列表取自Mozilla http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1

 from tld import get_tld from tld.utils import update_tld_names update_tld_names() print get_tld("http://www.google.co.uk") print get_tld("http://zap.co.it") print get_tld("http://google.com") print get_tld("http://mail.google.com") print get_tld("http://mail.google.co.uk") print get_tld("http://google.co.uk") 

这输出

 google.co.uk zap.co.it google.com google.com google.co.uk google.co.uk 

请注意,它通过离开co.ukco.it来正确处理国家级顶级域名(TLD),但是正确删除.com.co.ukwwwmail子域名

脚本开始处的update_tld_names()调用用于更新/同步来自Mozilla最新版本的tld名称。

不是 URL 的标准分解

你不能依靠www. 存在或可选。 在很多情况下,它不会。

所以,如果你想假设只有最后两个组件是相关的(这也不会为英国,例如www.google.co.uk ),那么你可以做一个split('.')[-2:]

或者,这实际上不太容易出错,请去掉www. 字首。

但无论如何, 你不能假设www. 是可选的,因为它不会每次都工作!

这是一个域的通用后缀列表。 您可以尝试保留后缀+一个组件。

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

但是,你打算如何处理first.last.name域? 假设所有姓氏相同的用户是同一家公司? 最初,您只能在那里获得三级域名。 到现在为止,你显然也可以获得二级的。 所以.name没有通用的规则。

对于域名操作,您也可以使用Dnspy

它有助于在各个级别上使用Mozilla Public Suffix列表的新副本来提取域(和域标签)。

使用tldexport工作正常,但在parsingblogspot.com子域名并创build混乱时显然有问题。 如果您想继续使用该库,请确保执行if条件或其他内容,以防止在子域中返回空string。

 from tld import get_tld from tld.utils import update_tld_names update_tld_names() result=get_tld('http://www.google.com') print 'https://'+result 

input: http : //www.google.com

结果:google.com

有多个Python模块封装库(一次Mozilla)公共后缀列表,其中有几个不需要input是一个URL。 即使这个问题专门针对URL标准化问题,我的要求是只处理域名,所以我提供了一个切线的答案。

publicsuffix2相对于publicsuffixlist或publicsuffix的优点还不清楚,但它们似乎都提供了基本的function。

publicsuffix2:

 >>> import publicsuffix # sic >>> publicsuffix.PublicSuffixList().get_public_suffix('www.google.co.uk') u'google.co.uk' 
  • 据说更多的包装友好的publicsuffix

publicsuffixlist:

 >>> import publicsuffixlist >>> publicsuffixlist.PublicSuffixList().privatesuffix('www.google.co.uk') 'google.co.uk' 
  • 发布idna支持,但我没有testing。

publicsuffix:

 >>> import publicsuffix >>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk') 'google.co.uk' 
  • 自己处理更新和caching下载文件的要求是一个复杂的问题。