如何使用beautifulsoup从pre标签中删除空格

时间:2013-02-01 23:53:51

标签: python beautifulsoup

考虑这段代码。

#!/usr/bin/env python
# -*- coding: utf8 -*-

from bs4 import BeautifulSoup
html_doc = """<pre class="code file d"><span class="kw2">import std.stdio
import core.bitop;

// parallel port address 
const uint port = 0x0c000;

void main()
{
    /*
        permission related stuff under linux
    */

    /* data */
    ubyte data = 0b_11111111;
    outp(port, data);
}
</span></pre>
"""

invalid_tags = ['span']

soup = BeautifulSoup(html_doc)

for tag in invalid_tags:
    for invalid in soup.findAll(tag):
        invalid.replaceWithChildren()

pre_tags = soup.find_all('pre')

for i in range (len(pre_tags)):
    pre_tags[i]['class'] = 'prettyprint'

output = soup.prettify(formatter=None)

output_text = output.encode('utf8', 'replace')

output_file = open('test.html', "w")
output_file.write(output_text)
output_file.close()

我有一个简单的html文档。在这种情况下,我想删除一些不需要的标记<span>,并更改<pre>标记的类名。

但是如果你看一下输出文件,第二行就会出现不需要的空白字符。

  <pre class="prettyprint">
   import std.stdio
import core.bitop;

// parallel port address 
const uint port = 0x0c000;

void main()
{
    /*
        permission related stuff under linux
    */

    /* data */
    ubyte data = 0b_11111111;
    outp(port, data);
}
  </pre>

我想在第二列之前删除不需要的空格字符,并希望它保持左对齐。

我该怎么做?有任何想法吗。感谢..

1 个答案:

答案 0 :(得分:1)

这里的问题是你正在呼叫prettify。所有其他的东西都是无关紧要的。如果你只是在span-removal循环之后打印出soup,并且在预重分类循环之后再次打印出来,那么内容就没问题了;另一方面,如果你在顶部打印soup.prettify(),没有这两个循环,它已经添加了额外的空格。

为什么呢?嗯,这就是prettify的重点。在文档中,Pretty-printing表示它将“每个HTML / XML标记放在自己的行上”。这包括<pre>个标签。

如果您想使用prettify,但希望它不会对pre标记进行美化,则需要创建并传入一个负责跳过pre标记的格式化程序。< / p>

或者,或者,你总是可以这样做(伪代码,而不是真正的代码):

for tag in find_all('pre'):
    replace tag contents with str(len(stash))
    stash.append(str(tag contents))
pretty = soup.prettify()
for i, tag in stash:
    pretty.replace('<pre>{}</pre>'.format(i), tag)

有争议的是,prettify应始终跳过pre标记(与CData一样)。请参阅this bug