Сохранять пробелы в шаблоне Django при записи в файл с помощью BeautifulSoup

У меня есть сценарий, который добавляет классы в теги заголовков с помощью 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>
 <div>
 <h2>Test</h2>
 {% if request.foo == 'bar' %}
 {{ line.get_something }}
 {% else %}
 {{ line.get_something_else }}
 </div>
</div>

становится:

<div>
 <div>
 <h2>
 Test
 </h2>
 <!-- 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 ответ

Хотя это взломать, самый чистый способ, который я нашел, был для патча обезьяны 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.

Я бы настоятельно рекомендовал использовать это, поскольку могут быть непреднамеренные последствия.

licensed under cc by-sa 3.0 with attribution.