考虑这段代码。
#!/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>
我想在第二列之前删除不需要的空格字符,并希望它保持左对齐。
我该怎么做?有任何想法吗。感谢..
答案 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。