使用tldextract包可以轻松完成这个任务,如果需要更多的信息,可以使用建议的urlparse:
>>> import tldextract
>>> tldextract.extract("http://lol1.domain.com:8888/some/page"
ExtractResult(subdomain='lol1', domain='domain', suffix='com')
>>> tldextract.extract("http://sub.lol1.domain.com:8888/some/page"
ExtractResult(subdomain='sub.lol1', domain='domain', suffix='com')
>>> urlparse.urlparse("http://sub.lol1.domain.com:8888/some/page")
ParseResult(scheme='http', netloc='sub.lol1.domain.com:8888', path='/some/page', params='', query='', fragment='')
请注意,tldextract 可以正确处理子域名。
urlparse.urlparse
会将URL拆分为协议、位置、端口等。然后您可以按.
拆分位置以获取子域。
import urlparse
url = urlparse.urlparse(address)
subdomain = url.hostname.split('.')[0]
web.host1.google.com
。 - mlissnerfrom urllib.parse import urlparse
进行导入。 - Lord Elrond以下是对这个精彩答案的修改版本:如何从URL中提取顶级域名(TLD)
您需要从这里获取有效TLD列表。
from __future__ import with_statement
from urlparse import urlparse
# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tldFile:
tlds = [line.strip() for line in tldFile if line[0] not in "/\n"]
class DomainParts(object):
def __init__(self, domain_parts, tld):
self.domain = None
self.subdomains = None
self.tld = tld
if domain_parts:
self.domain = domain_parts[-1]
if len(domain_parts) > 1:
self.subdomains = domain_parts[:-1]
def get_domain_parts(url, tlds):
urlElements = urlparse(url).hostname.split('.')
# urlElements = ["abcde","co","uk"]
for i in range(-len(urlElements),0):
lastIElements = urlElements[i:]
# i=-3: ["abcde","co","uk"]
# i=-2: ["co","uk"]
# i=-1: ["uk"] etc
candidate = ".".join(lastIElements) # abcde.co.uk, co.uk, uk
wildcardCandidate = ".".join(["*"]+lastIElements[1:]) # *.co.uk, *.uk, *
exceptionCandidate = "!"+candidate
# match tlds:
if (exceptionCandidate in tlds):
return ".".join(urlElements[i:])
if (candidate in tlds or wildcardCandidate in tlds):
return DomainParts(urlElements[:i], '.'.join(urlElements[i:]))
# returns ["abcde"]
raise ValueError("Domain not in global list of TLDs")
domain_parts = get_domain_parts("http://sub2.sub1.example.co.uk:80",tlds)
print "Domain:", domain_parts.domain
print "Subdomains:", domain_parts.subdomains or "None"
print "TLD:", domain_parts.tld
给您:
域名: example 子域名: ['sub2', 'sub1'] 顶级域名: co.uk
address = 'http://lol1.domain.com:8888/some/page'
host = address.partition('://')[2]
sub_addr = host.partition('.')[0]
print sub_addr
".".join(urlparse('http://www.my.cwi.nl:80/%7Eguido/Python.html').netloc.split(".")[:-2])
这将帮你完成任务(将返回“www.my”)。.co.uk
地址。除了英国外,以色列、巴西和日本都有正式的二级域名,可能还有其他国家也有。 - Thomas K将所有域名标准化为以www.开头,除非它们有子域名。
from urllib.parse import urlparse
def has_subdomain(url):
if len(url.split('.')) > 2:
return True
else:
return False
domain = urlparse(url).netloc
if not has_subdomain(url):
domain_name = 'www.' + domain
url = urlparse(url).scheme + '://' + domain
import tldextract
ext = tldextract.extract("http://lol1.domain.com:8888/some/page")
ExtractResult(subdomain='lol1', domain='domain', suffix='com')
ext.subdomain
结果将会是:
'lol1'
ext.domain
结果将会是:
'domain'
ext.suffix
结果将会是:
'com'
另外,如果你想将子域名的结果仅存储在一个变量中,那么使用下面的代码:
Sub_Domain = ext.subdomain
然后打印子域名
Sub_Domain
结果将会是:
'lol1'
使用Python 3(我具体使用的是3.9版本),您可以执行以下操作:
from urllib.parse import urlparse
address = 'http://lol1.domain.com:8888/some/page'
url = urlparse(address)
url.hostname.split('.')[0]
要提取主机名,我会使用urllib2中的urlparse:
>>> from urllib2 import urlparse
>>> a = "http://lol1.domain.com:8888/some/page"
>>> urlparse.urlparse(a).hostname
'lol1.domain.com'
>>> urlparse.urlparse(a).hostname.rpartition('.')[0].rpartition('.')[0]
'lol1'
我们可以使用https://github.com/john-kurkowski/tldextract解决这个问题...
很简单。
>>> ext = tldextract.extract('http://forums.bbc.co.uk')
>>> (ext.subdomain, ext.domain, ext.suffix)
('forums', 'bbc', 'co.uk')