使用BeautifulSoup写入文件时保留Django模板的空白字符
解决BeautifulSoup修改标签后保留原始HTML格式的问题
嘿,这个问题我太熟悉了!prettify()虽然能让输出的HTML看起来整齐,但它会强制重新格式化整个文档,把原有的缩进、空白甚至模板标签的排版都打乱,对Django这类需要保留原始格式的场景确实不友好。
解决方案:放弃prettify(),直接转换为字符串
你只需要把写入文件的代码从prettify()改成直接将soup对象转为字符串即可,这样BeautifulSoup只会修改你指定的元素,其余内容完全保留原始格式。
另外还要注意一个小坑:如果你的h1标签原本没有class属性,直接用tag['class'].append()会抛出KeyError,所以建议用更稳妥的写法来添加类。
修改后的完整脚本:
#!/usr/bin/env python from bs4 import BeautifulSoup soup = BeautifulSoup(open('test.html'), 'html.parser') heading_tags = soup.find_all('h1') for tag in heading_tags: # 先确保class属性存在,不存在则创建空列表 tag.attrs.setdefault('class', []).append('new-class') with open('test.html', 'w') as html_doc: # 直接转换为字符串写入,保留原始格式 html_doc.write(str(soup))
原理说明
str(soup)会输出BeautifulSoup解析后未经过格式化的原始内容,只应用了你对标签属性的修改,完全不会改动原文档的空白、缩进和其他结构,完美适配Django模板这类对格式敏感的文件。
内容的提问来源于stack exchange,提问作者mc_kaiser
相关产品推荐
相关产品推荐

