蟒蛇里urlparse - 提取域名没有子域(Python urlparse — extract

2019-07-18 10:04发布

需要一种方法来提取域名而不使用Python一里urlparse URL的子域。

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

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

我知道这是可以编写一些自定义字符串操作把www.google.com到google.com,但我想,以避免这项任务由手串变换或正则表达式。 (这样做的原因是,我没有与URL形成规则有信心,我可以考虑编写自定义分析功能所需的每个边缘情况不够熟悉。)

或者,如果urlparse不能做什么,我需要,没有人知道任何其他Python URL的解析库,会吗?

Answer 1:

你可能想看看tldextract ,专门做这种事情一个图书馆。

它使用公共后缀列表,试图得到基于已知的通用顶级域名一个体面的分裂,但千万注意,这仅仅是一个蛮力名单,没有什么特别的,所以它可以容易过时的(虽然希望它的策划,以免)。

>>> 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"


Answer 2:

这是一个更新的基础上,获得更新的答案赏金的请求

通过启动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 ,但适当地消除了wwwmail子域都.com.co.uk

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



Answer 3:

不是 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没有一般规则。



Answer 4:

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

它有助于各级提取物域(和域标签),使用Mozilla公共后缀列表的新副本。



Answer 5:

使用tldexport工作正常,但显然有一个问题,在分析blogspot.com子域,并创建一个烂摊子。 如果你想继续与该库,确保实现一个if条件或东西,以防止返回子域中的一个空字符串。



Answer 6:

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

输入: http://www.google.com

结果:google.com



Answer 7:

有多种Python模块,其封装(一旦Mozilla的)公共后缀列表中的一个库,其中有几个要求输入是一个URL。 尽管这个问题询问有关URL规范化具体来说,我的要求是处理只是域名,所以我提供了一个切向的答案。

的相对优点publicsuffix2在publicsuffixlist或publicsuffix尚不清楚,但他们似乎都提供基本的功能。

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支持,然而,我没有测试。

publicsuffix:

>>> import publicsuffix
>>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk')
'google.co.uk'
  • 要求办理更新和缓存自己下载的文件是有点复杂的。


文章来源: Python urlparse — extract domain name without subdomain