如何判断DataFrame中各URL所属的网站根域名?
精准提取URL根域名的解决方案(适配DataFrame批量处理)
嘿,我刚好踩过这个坑——之前处理过一堆带深层路径的URL,要提取正确的根域名(比如https://www.mordgpi.ru/our-life/news/46/55116/得拿到mordgpi.ru,而不是gpi.ru),简单的字符串拆分完全不靠谱,得用专门的方法来搞。
首选方案:用tldextract库一键搞定
这个库是专门干这个的,内置了公共后缀列表(Public Suffix List)——就是那种记录了所有合法顶级/公共后缀的清单,能准确区分像ru、co.uk这类不同层级的后缀,完美解决你的需求。
第一步:安装库
pip install tldextract
第二步:批量处理DataFrame
假设你的DataFrame叫url_df,有一列存URL的字段叫url,直接写个函数批量应用就行:
import tldextract import pandas as pd def get_root_domain(url): # 提取域名各部分:子域名、主域名、公共后缀 extracted = tldextract.extract(url) # 拼接主域名和公共后缀,就是我们要的根URL return f"{extracted.domain}.{extracted.suffix}" # 给DataFrame新增一列存根域名 url_df['root_domain'] = url_df['url'].apply(get_root_domain)
测试几个真实场景:
- 输入
http://www.agpu.net/→ 输出agpu.net - 输入
https://www.mordgpi.ru/our-life/news/46/55116/→ 输出mordgpi.ru - 输入
https://shop.example.co.uk/products/123→ 输出example.co.uk(正确识别co.uk是公共后缀,不会拆成co.uk或者uk)
备选方案:手动实现(不依赖第三方库)
如果不想加新的依赖,你可以自己维护一个公共后缀的集合,然后从右往左遍历域名分段来判断。不过这个方法需要定期更新后缀列表,不如库省心,适合特殊场景:
# 这里只放了几个常见后缀,实际要用到完整的公共后缀列表哦 PUBLIC_SUFFIXES = {'ru', 'net', 'org', 'co.uk', 'com.au'} def get_root_domain_manual(url): from urllib.parse import urlparse # 先解析URL,拿到域名部分(处理带/不带协议的情况) parsed = urlparse(url) domain = parsed.netloc or parsed.path # 把域名拆成小段,比如 www.mordgpi.ru → ['www', 'mordgpi', 'ru'] parts = domain.split('.') # 从右往左找公共后缀 suffix_parts = [] while parts and '.'.join(suffix_parts + [parts[-1]]) in PUBLIC_SUFFIXES: suffix_parts.insert(0, parts.pop()) # 拼接主域名和公共后缀 if parts and suffix_parts: return f"{parts[-1]}.{'.'.join(suffix_parts)}" # 处理异常情况(比如无效URL) return domain
几个关键提醒
- 要兼容各种URL格式:带/不带http/https、带/不带www、深层路径、甚至没有协议的纯域名
tldextract的公共后缀列表会更新,如果你需要最新的规则,可以运行tldextract.update()来同步- 批量处理时记得加异常捕获,比如碰到无效URL不会整个流程崩掉:
def get_root_domain_safe(url): try: extracted = tldextract.extract(url) return f"{extracted.domain}.{extracted.suffix}" except: return None # 或者返回原始URL,根据需求调整
内容的提问来源于stack exchange,提问作者Nikita Popov
相关产品推荐
相关产品推荐

