Cla*_*ell 45 python url parsing urlparse
需要一种方法来使用Python urlparse从URL中提取没有子域的域名.
例如,我想"google.com"从一个完整的URL中提取出来"http://www.google.com".
我似乎最接近的urlparse是netloc属性,但它包括子域,在本例中它将是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)
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.uk和co.it,但适当的删除www和mail子域都.com和.co.uk
update_tld_names()脚本开头的调用用于使用Mozilla中的最新版本更新/同步tld名称.
这不是 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没有一般规则.