使用 BeautifulSoup 写入文件时在 Django 模板中保留空格

Posted

技术标签:

【中文标题】使用 BeautifulSoup 写入文件时在 Django 模板中保留空格【英文标题】:Preserve Whitespace in Django Template When Writing to a File With BeautifulSoup 【发布时间】:2018-10-07 19:26:39 【问题描述】:

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

【问题讨论】:

这可能会有所帮助:***.com/a/15513483/7832176 【参考方案1】:

虽然这是一个 hack,但我发现最干净的方法是猴子补丁 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 将某些标签(在 beautifulsoup4 中只是 pretextarea)附加到 preserve_whitespace_tag_stack。这个猴子补丁只是覆盖了这种行为,因此 all 标记最终出现在 preserve_whitespace_tag_stack

请谨慎使用,因为可能会产生意想不到的后果。

【讨论】:

以上是关于使用 BeautifulSoup 写入文件时在 Django 模板中保留空格的主要内容,如果未能解决你的问题,请参考以下文章

Python BeautifulSoup 在写入文件时创建奇怪的 \xe2 unicode 字符

使用 python 和 Beautifulsoup4 从抓取数据中写入和保存 CSV 文件

Python爬虫之利用BeautifulSoup爬取豆瓣小说——将小说信息写入文件

如何从线程只写入一次文件?

将文件写入 blob 容器时在根容器中创建空文件

调用另一个应用程序中的活动时在清单文件中写入啥结果?