Сохранять пробелы в шаблоне 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.