我有一个脚本,使用Beautiful Soup将标题添加到标题标记。
#!/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:
tag['class'].append('new-class')
with open('test.html', 'w') as html_doc:
html_doc.write(soup.prettify())
这很好用,但我想在写入文件时保留文件中的空格。例如,这个Django模板:
<div class="something">
<div class="else">
<h1 class="original-class">Test</h1>
{% if request.foo == 'bar' %}
{{ line.get_something }}
{% else %}
{{ line.get_something_else }}
</div>
</div>
变为:
<div class="something">
<div class="else">
<h1 class="original-class new-class">
Test
</h1>
<!-- The formatting is off here: -->
{% if request.foo == 'bar' %}
{{ line.get_something }}
{% else %}
{{ line.get_something_else }}
</div>
</div>
我也尝试使用soup.encode()
而不是soup.prettify()
。这保留了Django模板代码,但展平了HTML结构。
使用Beautiful Soup写文件时是否可以保留原始文件的空格?
答案 0 :(得分:0)
虽然这是一个黑客攻击,但我找到的最干净的方法是修补补丁BeautifulSoup.pushTag
:
#!/usr/bin/env python
from bs4 import BeautifulSoup
pushTag = BeautifulSoup.pushTag
def myPushTag(self, tag):
pushTag(self, tag)
self.preserve_whitespace_tag_stack.append(tag)
BeautifulSoup.pushTag = myPushTag
在BeautifulSoup中,pushTag
将某些标记(只有pre
和textarea
添加到beautifulsoup4中)添加到preserve_whitespace_tag_stack
。这个猴子补丁刚刚覆盖了这种行为,因此所有标签最终都在preserve_whitespace_tag_stack
。
我在使用时要小心,因为可能会产生意想不到的后果。