pandas提取DataFrame列DCG_开头至</div>前内容的正确方法
问题说明
存储HTML内容的DataFrame列单元格示例:
<div data-wrapper="true" style="font-size:9pt;font-family:'Segoe UI','Helvetica Neue',sans-serif;"><div>DCG_QLKNDFALGKFNDGOIQERKNGLÑADKFNGOWQIREG</div></div>
清洗目标:保留从DCG_起始、到</div>标签前的内容,预期输出为:
DCG_QLKNDFALGKFNDGOIQERKNGLÑADKFNGOWQIREG
不同单元格内DCG_和</div>的位置不固定,原有实现代码执行后全列返回null:
df['html'] = df['html'].str[df['html'.str.find('DCG_':]
错误原因
原有代码存在两个核心问题:
- 语法错误:列名引用缺失右方括号,
df['html'.str.find属于非法写法,正确的列访问格式应为df['html'] - 逻辑错误:切片仅写了起始位置规则,未定义终止位置,且直接将整列的find结果传入切片语法会导致索引错位,无法正确逐行匹配截取位置。
实现方案
推荐方案:正则提取(简洁稳定)
使用pandas内置的向量化正则提取方法,直接匹配目标规则,无需手动计算位置,容错性更高:
# 匹配规则:捕获DCG_开头,后续所有直到<标签前的内容 df['html'] = df['html'].str.extract(r'(DCG_[^<]+)')
备选方案:位置切片
如果希望用位置截取的逻辑实现,可分别计算每行的起始、终止位置后再切片:
# 逐行计算DCG_的起始索引 start = df['html'].str.find('DCG_') # 从DCG_位置往后查找最近的</div>索引 end = df['html'].apply(lambda x: x.find('</div>', x.find('DCG_'))) # 逐行切片取值 df['html'] = [s[st:ed] for s, st, ed in zip(df['html'], start, end)]
两种方案都能适配目标内容位置不固定的场景,正则方案代码更简洁,对HTML结构小变动的适配性更好。
内容的提问来源于stack exchange,提问作者Berny
相关产品推荐
相关产品推荐

