需要使用Python urlparse从网址中提取没有子域名的域名。
例如,我想从"google.com"
这样的完整网址中提取"http://www.google.com"
。
我似乎与urlparse
最接近的是netloc
属性,但其中包含子域名,在此示例中为www.google.com
。
我知道可以编写一些自定义字符串操作来将www.google.com转换为google.com,但我想在此任务中避免使用字符串转换或正则表达式。 (原因是我对url形成规则不够熟悉,以确信我可以考虑编写自定义解析函数所需的每个边缘情况。)
或者,如果urlparse
不能做我需要的,有没有人知道任何其他Python url解析库?
答案 0 :(得分:53)
你可能想看看tldextract,这是一个专门做这类事情的图书馆。
它使用公共后缀列表尝试根据已知的gTLD进行适当的拆分,但请注意,这只是一个蛮力列表,没什么特别的,所以它可能会过时(尽管希望它已经过时了不要)。
>>> 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"
答案 1 :(得分:23)
此更新是基于更新答案的赏金请求
首先使用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
正确处理国家/地区级别的TLD,但正确删除了www
和mail
和.com
个子域名{1}}
脚本开头的.co.uk
调用用于使用Mozilla中的最新版本更新/同步tld名称。
答案 2 :(得分:7)
不是网址的标准分解。
您不能依赖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
,没有一般规则。
答案 3 :(得分:2)
对于域名操作,您还可以使用Dnspy
使用Mozilla Public Suffix列表的新副本,它有助于在各个级别提取域名(和域名标签)。
答案 4 :(得分:1)
使用tldexport工作正常,但在解析blogspot.com子域并且造成混乱时显然有问题。 如果您想继续使用该库,请确保实现if条件或某些内容以防止在子域中返回空字符串。
答案 5 :(得分:1)
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
结果:google.com
答案 6 :(得分:0)
有多个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'