Сохранять пробелы в шаблоне Django при записи в файл с BeautifulSoup - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть скрипт, который добавляет классы к тегам заголовков с помощью 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 голосов
/ 02 мая 2018

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

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

...