hoj*_*oju 49 python dns url parsing extract
如何从URL中提取域名,不包括任何子域名?
我最初的简单尝试是:
'.'.join(urlparse.urlparse(url).netloc.split('.')[-2:])
Run Code Online (Sandbox Code Playgroud)
这适用于http://www.foo.com,但不适用于http://www.foo.com.au.有没有办法在不使用有关有效TLD(顶级域名)或国家/地区代码(因为它们发生变化)的特殊知识的情况下正确执行此操作.
谢谢
Aco*_*orn 48
这是一个伟大的python模块,有人在看到这个问题后写了解决这个问题:https: //github.com/john-kurkowski/tldextract
该模块在公共后缀列表中查找TLD ,由Mozilla志愿者提供
引用:
tldextract
另一方面,根据公共后缀列表查找当前生存的gTLD,通用顶级域名(通用顶级域名)和国家和地区代码顶级域名(国家和地区代码顶级域名)是什么样的.因此,给定一个URL,它从其域中知道其子域,并从其国家代码中知道其域.
Ale*_*lli 43
不,没有"内在"的方式知道(例如)zap.co.it
是一个子域(因为意大利的注册商出售域名co.it
)而zap.co.uk
不是(因为英国的注册商不会出售域名co.uk
,但只是喜欢zap.co.uk
).
你只需要使用一个辅助表(或在线资源)来告诉你哪个TLD的行为特别像英国和澳大利亚 - 没有办法在没有这些额外语义知识的情况下仅仅盯着字符串(当然它可以最终会改变,但如果你能找到一个好的在线资源,那么资源也会相应改变,人们希望! - ).
Mar*_*kus 42
from __future__ import with_statement
from urlparse import urlparse
# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tld_file:
tlds = [line.strip() for line in tld_file if line[0] not in "/\n"]
def get_domain(url, tlds):
url_elements = urlparse(url)[1].split('.')
# url_elements = ["abcde","co","uk"]
for i in range(-len(url_elements), 0):
last_i_elements = url_elements[i:]
# i=-3: ["abcde","co","uk"]
# i=-2: ["co","uk"]
# i=-1: ["uk"] etc
candidate = ".".join(last_i_elements) # abcde.co.uk, co.uk, uk
wildcard_candidate = ".".join(["*"] + last_i_elements[1:]) # *.co.uk, *.uk, *
exception_candidate = "!" + candidate
# match tlds:
if (exception_candidate in tlds):
return ".".join(url_elements[i:])
if (candidate in tlds or wildcard_candidate in tlds):
return ".".join(url_elements[i-1:])
# returns "abcde.co.uk"
raise ValueError("Domain not in global list of TLDs")
print get_domain("http://abcde.co.uk", tlds)
Run Code Online (Sandbox Code Playgroud)
结果是:
abcde.co.uk
Run Code Online (Sandbox Code Playgroud)
如果有人让我知道上面哪些部分可以用更加pythonic的方式重写,我会很感激.例如,必须有更好的迭代last_i_elements
列表的方法,但我想不出一个.我也不知道是否ValueError
是最好的事情.评论?
Art*_*yan 26
使用python tld
https://pypi.python.org/pypi/tld
pip install tld
Run Code Online (Sandbox Code Playgroud)
from tld import get_tld
print get_tld("http://www.google.co.uk")
Run Code Online (Sandbox Code Playgroud)
co.uk
或没有协议
from tld import get_tld
get_tld("www.google.co.uk", fix_protocol=True)
Run Code Online (Sandbox Code Playgroud)
co.uk
from tld import get_tld
res = get_tld("http://some.subdomain.google.co.uk", as_object=True)
res
# 'co.uk'
res.subdomain
# 'some.subdomain'
res.domain
# 'google'
res.tld
# 'co.uk'
res.fld
# 'google.co.uk'
res.parsed_url
# SplitResult(
# scheme='http',
# netloc='some.subdomain.google.co.uk',
# path='',
# query='',
# fragment=''
# )
Run Code Online (Sandbox Code Playgroud)
from tld import get_fld
get_fld("http://www.google.co.uk")
# 'google.co.uk'
Run Code Online (Sandbox Code Playgroud)