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

Python中如何去除嵌套列表的HTML元素?Pandas列处理求助

问题解决:Pandas列表列中HTML标签未被BeautifulSoup去除的问题

问题根源

你写的循环里,item = soup.get_text()只是给临时变量item重新赋值,根本没改动原DataFrame中col1列表里的实际元素——相当于你拿了个副本改了,但原件还在原地,所以输出里标签依旧存在。

修复方案1:通过索引直接修改原列表元素

遍历的时候用索引定位到列表里的元素,直接替换掉原内容:

from bs4 import BeautifulSoup
import pandas as pd

df = pd.DataFrame({
    "col1":[["<span style='color: red;'>9</span>", "abcd"], ["a", "b, d"], ["a, b, z, x, y"], ["a, y","y, z, b"]], 
    "col2":[0, 1, 0, 1],
})

# 遍历每个列表,用索引更新元素
for i, sub_list in enumerate(df["col1"]):
    for j, item in enumerate(sub_list):
        if "span" in item:
            soup = BeautifulSoup(item, features="lxml")
            sub_list[j] = soup.get_text()

print(df)

修复方案2:用Pandas的apply方法(更简洁高效)

用apply配合自定义函数处理每个子列表的元素,这是更符合Pandas风格的写法:

from bs4 import BeautifulSoup
import pandas as pd

df = pd.DataFrame({
    "col1":[["<span style='color: red;'>9</span>", "abcd"], ["a", "b, d"], ["a, b, z, x, y"], ["a, y","y, z, b"]], 
    "col2":[0, 1, 0, 1],
})

# 定义清理HTML的函数
def extract_text(item):
    if "span" in item:
        return BeautifulSoup(item, features="lxml").get_text()
    return item

# 对col1的每个子列表,批量处理元素
df["col1"] = df["col1"].apply(lambda lst: [extract_text(x) for x in lst])

print(df)

最终效果

运行任意一种方案后,col1都会变成你期望的结构:

col1  col2
0                [9, abcd]     0
1                 [a, b, d]     1
2  [a, b, z, x, y]     0
3        [a, y, y, z, b]     1

内容的提问来源于stack exchange,提问作者Mr.Slow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:50:33