如何将修改后的ResultSet放回BeautifulSoup对象以进行后续文本转换?
解决方法
首先你代码里有几个明显的语法和逻辑问题:
if tag.has_attr('href')末尾缺少冒号:tag_copy未定义,直接引用会报错- 没必要手动实例化
ResultSet(),它是BeautifulSoup内部用于存储查询结果的类,日常用普通列表存标签即可
针对你的需求,有两种更简洁的实现方式:
方式一:直接修改原标签(推荐)
BeautifulSoup中的Tag对象是引用类型,你遍历到的标签就是原souped对象里的实例,修改标签属性会直接同步到原soup对象,不需要额外“放回”操作。
修正后的代码:
from bs4 import BeautifulSoup text = '<link href="link">' souped = BeautifulSoup(text, 'html.parser') # 遍历所有标签并修改href属性 for tag in souped.find_all(): if tag.has_attr('href'): tag['href'] = 'modified_link' # 此时souped已经是修改后的对象,直接赋值给目标变量即可 link_modified_souped = souped # 后续文本转换操作示例 print(link_modified_souped.prettify())
方式二:构建新的BeautifulSoup对象(保留原对象不变)
如果需要保留原souped对象不被修改,可以复制标签并重新构建一个新的soup实例:
from bs4 import BeautifulSoup, Tag text = '<link href="link">' souped = BeautifulSoup(text, 'html.parser') modified_tags = [] for tag in souped.find_all(): # 复制标签,避免修改原对象 tag_copy = Tag(souped, name=tag.name, attrs=tag.attrs) if tag_copy.has_attr('href'): tag_copy['href'] = 'modified_link' modified_tags.append(tag_copy) # 创建空的soup对象,将修改后的标签添加进去 link_modified_souped = BeautifulSoup("", 'html.parser') for tag in modified_tags: link_modified_souped.append(tag) # 后续操作示例 print(link_modified_souped.prettify())
内容的提问来源于stack exchange,提问作者Dimon Agon
相关产品推荐
相关产品推荐

