如何在Python中从各类URL、子域名、带端口URL提取根域名
如何在Python中从各类URL/域名提取根域名
待处理的URL/域名列表
- https://abc.example.com/dir
- http://abc.example.abde?param=value
- https://aaa.abc.example.zaddj?param=value
- tcp://cces.example.com:5598
- ccc.ddd.example.com
尝试过的无效方法
方法1:使用urlparse库
问题:无法识别非HTTP协议的URL(如第4、5个案例),netloc字段为空导致提取失败。
代码:
from urllib.parse import urlparse def get_root_domain_from_url(url): parsed_url = urlparse(url) domain_parts = parsed_url.netloc.split('.') if len(domain_parts) > 2: root_domain = domain_parts[-2] + '.' + domain_parts[-1] else: root_domain = parsed_url.netloc return root_domain
方法2:使用tldextract库
问题:依赖公共TLD列表,无法处理非标准TLD的域名(如第2、3个案例中的example.abde、example.zaddj)。
代码:
import tldextract def get_root_domain_from_url(url): extracted = tldextract.extract(url) if extracted.subdomain: root_domain = extracted.subdomain[:-1] + '.' + extracted.domain + '.' + extracted.suffix else: root_domain = extracted.domain + '.' + extracted.suffix return root_domain
方法3:正则表达式
问题:URL协议、格式多样,难以编写覆盖所有场景的正则规则,适配性差。
期望输出结果
https://abc.example.com/dir -> example.com http://abc.example.abde?param=value -> example.abde https://aaa.abc.example.zaddj?param=value -> example.zaddj tcp://cces.example.com:5598 -> example.com ccc.ddd.example.com -> example.com
适配所有场景的解决方案
核心逻辑:先剥离URL中的协议、路径、参数、端口等冗余部分,仅保留纯域名;再从域名中提取最后两段作为根域名(符合期望结果的规则)。
代码实现
def extract_root_domain(url): # 剥离协议前缀(如https://、tcp://) if '://' in url: url = url.split('://')[1] # 剥离路径、查询参数 for separator in ['/', '?']: if separator in url: url = url.split(separator)[0] # 剥离端口号 if ':' in url: url = url.split(':')[0] # 拆分域名片段,取最后两段 domain_segments = url.split('.') if len(domain_segments) >= 2: return f"{domain_segments[-2]}.{domain_segments[-1]}" return url # 处理极端情况(如单个域名片段) # 测试验证 test_urls = [ "https://abc.example.com/dir", "http://abc.example.abde?param=value", "https://aaa.abc.example.zaddj?param=value", "tcp://cces.example.com:5598", "ccc.ddd.example.com" ] for url in test_urls: print(f"{url} -> {extract_root_domain(url)}")
运行结果
https://abc.example.com/dir -> example.com http://abc.example.abde?param=value -> example.abde https://aaa.abc.example.zaddj?param=value -> example.zaddj tcp://cces.example.com:5598 -> example.com ccc.ddd.example.com -> example.com
内容的提问来源于stack exchange,提问作者J Jogal
相关产品推荐
相关产品推荐

