-1

考虑这段代码。

#!/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>

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

我怎样才能做到这一点?有任何想法吗。谢谢..

4

1 回答 1

2

这里的问题是您正在调用prettify. 所有其他的东西都无关紧要。如果你只是soup在 span-removing 循环之后打印出来,然后在 pre-reclassifying 循环之后再次打印出来,内容就可以了;另一方面,如果你soup.prettify()在顶部打印出来,没有这两个循环,它已经添加了额外的空白。

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

如果你想使用prettify,但不希望它美化pre标签,你需要创建并传入一个格式化程序来处理跳过pre标签。

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

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)。看到这个错误

于 2013-02-02T00:41:04.873 回答