You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中从各类URL、子域名、带端口URL提取根域名

如何在Python中从各类URL/域名提取根域名

待处理的URL/域名列表

  1. https://abc.example.com/dir
  2. http://abc.example.abde?param=value
  3. https://aaa.abc.example.zaddj?param=value
  4. tcp://cces.example.com:5598
  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:42:35