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

时间:2013-01-18 19:33:45

标签: python parsing url urlparse

需要使用Python urlparse从网址中提取没有子域名的域名。

例如,我想从"google.com"这样的完整网址中提取"http://www.google.com"

我似乎与urlparse最接近的是netloc属性,但其中包含子域名,在此示例中为www.google.com

我知道可以编写一些自定义字符串操作来将www.google.com转换为google.com,但我想在此任务中避免使用字符串转换或正则表达式。 (原因是我对url形成规则不够熟悉,以确信我可以考虑编写自定义解析函数所需的每个边缘情况。)

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

7 个答案:

答案 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.ukco.it正确处理国家/地区级别的TLD,但正确删除了wwwmail.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

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

结果:google.com

答案 6 :(得分:0)

有多个Python模块将(一次是Mozilla)公共后缀列表封装在库中,其中一些不要要求输入为URL。即使问题具体涉及URL规范化,我的要求是只处理域名,因此我提供了相关的答案。

publicsuffix2相对于publicsuffixlistpublicsuffix的相对优点尚不清楚,但它们似乎都提供了基本功能。

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'
  • 处理更新并自行缓存下载文件的要求有点复杂。