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

Cla*_*ell 45 python url parsing urlparse

需要一种方法来使用Python urlparse从URL中提取没有子域的域名.

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

我似乎最接近的urlparsenetloc属性,但它包括子域,在本例中它将是www.google.com.

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

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

Gar*_*tty 59

您可能想要查看tldextract,这是一个专门用于执行此类操作的库.

它使用公共后缀列表尝试根据已知的通用顶级域名(gTLD)进行合理的拆分,但请注意,这只是一个强力列表,没有什么特别之处,所以它可能会过时(尽管希望它已经过时而不是为了).

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

所以在你的情况下:

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

  • `ExtractResult(subdomain ='my.first',domain ='last',tld ='name')` - 这就是你所期望的. (3认同)

And*_*ndy 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")
Run Code Online (Sandbox Code Playgroud)

这输出

google.co.uk
zap.co.it
google.com
google.com
google.co.uk
google.co.uk
Run Code Online (Sandbox Code Playgroud)

请注意,它正确地离开处理国家一级顶级域名co.ukco.it,但适当的删除wwwmail子域都.com.co.uk

update_tld_names()脚本开头的调用用于使用Mozilla中的最新版本更新/同步tld名称.

  • 不确定是否是版本问题,但在 python3.6 上, `get_tld("http://mail.google.co.uk")` 返回 `co.uk` 等。 (3认同)
  • 是否有任何特别的理由推荐这个而不是“tldextract”和/或“publicsuffix”? (2认同)

Ano*_*sse 7

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

  • +1 指出没有实际的正确答案,并且还给出了两个最好的启发式方法(使用或从其他地方获取)“有效 TLD”列表,然后为模棱两可的 TLD 做出选择,或使用列表的“可丢弃前缀”并保留其他所有内容)。 (2认同)