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
相关产品推荐
相关产品推荐

