gpt4 book ai didi

python - BeautifulSoup .prettify() 的自定义缩进宽度

转载 作者:IT老高 更新时间:2023-10-28 22:15:53 36 4
gpt4 key购买 nike

有没有办法为 .prettify() 函数定义自定义缩进宽度?从我可以从它的来源获得的信息 -

def prettify(self, encoding=None, formatter="minimal"):
if encoding is None:
return self.decode(True, formatter=formatter)
else:
return self.encode(encoding, True, formatter=formatter)

无法指定缩进宽度。我认为这是因为 decode_contents() 函数中的这一行 -

s.append(" " * (indent_level - 1))

固定长度为 1 个空格! (为什么!!)我尝试指定 indent_level=4,结果就是这样 -

    <section>
<article>
<h1>
</h1>
<p>
</p>
</article>
</section>

这看起来很愚蠢。 :|

现在,我可以解决这个问题,但我只是想确定我是否缺少任何东西。因为这应该是一个基本功能。 :-/

如果你有更好的美化 HTML 代码的方法,请告诉我。

最佳答案

实际上,我自己处理了这个问题,采用了最老套的方式:通过对结果进行后处理。

r = re.compile(r'^(\s*)', re.MULTILINE)
def prettify_2space(s, encoding=None, formatter="minimal"):
return r.sub(r'\1\1', s.prettify(encoding, formatter))

实际上,我在类里面用 prettify_2space 代替了 prettify。这对解决方案来说不是必需的,但无论如何我们都要这样做,并将缩进宽度作为参数而不是将其硬编码为 2:

orig_prettify = bs4.BeautifulSoup.prettify
r = re.compile(r'^(\s*)', re.MULTILINE)
def prettify(self, encoding=None, formatter="minimal", indent_width=4):
return r.sub(r'\1' * indent_width, orig_prettify(self, encoding, formatter))
bs4.BeautifulSoup.prettify = prettify

所以:

x = '''<section><article><h1></h1><p></p></article></section>'''
soup = bs4.BeautifulSoup(x)
print(soup.prettify(indent_width=3))

…给出:

<html>
<body>
<section>
<article>
<h1>
</h1>
<p>
</p>
</article>
</section>
</body>
</html>

很明显,如果你想修补 Tag.prettify 以及 BeautifulSoup.prettify,你必须在那里做同样的事情。 (您可能想要创建一个可以应用于两者的通用包装器,而不是重复自己。)如果有任何其他 prettify 方法,同样的处理。

关于python - BeautifulSoup .prettify() 的自定义缩进宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509397/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com