如何在Python DataFrame中提取链接域名?解决TypeError报错
解决提取域名时的TypeError问题
问题根源
你用df[['Источник 1']]得到的是DataFrame对象,直接调用apply(get_domain)时,函数会接收整列数据而非单个URL字符串,这就触发了expected string or bytes-like object错误。另外,列里如果存在非字符串值(比如NaN、空值),也会引发同样的报错。
修复方案
- 把单列数据转为Series:用
df['Источник 1'](单括号)替代df[['Источник 1']],这样apply会逐个处理每个URL元素。 - 在
get_domain函数里先做类型校验,过滤非字符串/空值,避免无效输入报错。
修正后的代码
import re from tldextract import extract # pip install tldextract # 单括号获取Series,而非双括号生成的DataFrame df25 = df['Источник 1'] def get_domain(url): # 先处理非字符串、空值的情况 if not isinstance(url, str) or url.strip() == "": return None # 也可以返回空字符串等你需要的默认值 subdomain, domain, suffix = extract(url) ignored = ["www", "web"] if not subdomain or subdomain.lower() in ignored: return f"{domain}.{suffix}" # 补全后缀,返回完整域名(原代码只返回domain会丢失后缀) pat = r"^(?:{})\.".format("|".join(ignored)) cleaned_subdomain = re.sub(pat, "", subdomain) return f"{cleaned_subdomain}.{domain}.{suffix}" # 对Series调用apply逐个处理元素 df25 = df25.apply(get_domain)
额外提示
如果需要把提取后的域名放回原DataFrame,直接赋值即可:df['提取的域名'] = df25.apply(get_domain)
内容的提问来源于stack exchange,提问作者politolog197
相关产品推荐
相关产品推荐

