需要一种方法来提取域名而不使用Python一里urlparse URL的子域。
例如,我想提取"google.com"
从完整的URL "http://www.google.com"
。
我似乎来与最接近urlparse
是netloc
属性,但包括子域,在这个例子是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.uk
和co.it
,但适当地消除了www
和mail
子域都.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'
publicsuffixlist:
>>> import publicsuffixlist
>>> publicsuffixlist.PublicSuffixList().privatesuffix('www.google.co.uk')
'google.co.uk'
publicsuffix:
>>> import publicsuffix
>>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk')
'google.co.uk'
文章来源: Python urlparse — extract domain name without subdomain