使用BeautifulSoup写入文件时保留Django模板中的空白

时间:2018-04-27 01:54:38

标签: python html beautifulsoup django-templates whitespace

我有一个脚本,使用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写文件时是否可以保留原始文件的空格?

1 个答案:

答案 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将某些标记(只有pretextarea添加到beautifulsoup4中)添加到preserve_whitespace_tag_stack。这个猴子补丁刚刚覆盖了这种行为,因此所有标签最终都在preserve_whitespace_tag_stack

我在使用时要小心,因为可能会产生意想不到的后果。