Python urlparse – 提取没有子域名的域名
需要一种方法来提取一个没有使用Python urlparse的url中的子域名的域名。
例如,我想从诸如"http://www.google.com"
的完整url中提取"google.com"
"http://www.google.com"
。
最接近的,我似乎来与urlparse
是netloc
属性,但包括子域名,在这个例子中是www.google.com
。
我知道可以编写一些自定义string操作来将www.google.com变成google.com,但是我想避免在这个任务中进行string转换或正则expression式。 (原因是我对URL形成规则不够熟悉,以至于我可以考虑编写自定义parsing函数时所需的每个边界案例。)
或者,如果urlparse
不能做我所需要的,有没有人知道任何其他的Pythonurlparsing库呢?
你可能想要看看tldextract ,这是一个专门用来做这种事情的库。
它使用公共后缀列表来尝试在已知通用顶级域名(gTLD)基础上进行体面分割,但请注意,这只是一个powershell清单,没有什么特别之处,所以它可能会过时(尽pipe希望这样做是为了避免)。
>>> 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"
这是一个更新,基于更新答案的赏金请求
首先使用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),但是正确删除.com
和.co.uk
的www
和mail
子域名
脚本开始处的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
没有通用的规则。
对于域名操作,您也可以使用Dnspy
它有助于在各个级别上使用Mozilla Public Suffix列表的新副本来提取域(和域标签)。
使用tldexport工作正常,但在parsingblogspot.com子域名并创build混乱时显然有问题。 如果您想继续使用该库,请确保执行if条件或其他内容,以防止在子域中返回空string。
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
input: http : //www.google.com
结果:google.com
有多个Python模块封装库(一次Mozilla)公共后缀列表,其中有几个不需要input是一个URL。 即使这个问题专门针对URL标准化问题,我的要求是只处理域名,所以我提供了一个切线的答案。
publicsuffix2相对于publicsuffixlist或publicsuffix的优点还不清楚,但它们似乎都提供了基本的function。
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
支持,但我没有testing。
publicsuffix:
>>> import publicsuffix >>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk') 'google.co.uk'
- 自己处理更新和caching下载文件的要求是一个复杂的问题。