![](/img/trans.png)
[英]BeautifulSoup: just get inside of a tag, no matter how many enclosing tags there are
[英]BeautifulSoup: tag enclosing formatting
当我美化汤时,我试图得到这个:
<tag attr="val" />
而不是这个:
<tag attr="val"></tag>
我检查了bs4.formatter
代码,但没有找到与我的需求相关的选项:
def __init__(
self, language=None, entity_substitution=None,
void_element_close_prefix='/', cdata_containing_tags=None,
empty_attributes_are_booleans=False, indent=1,
):
我怎样才能做到这一点? 谢谢
我尝试使用 new_tap 选项和 bs4.formatter 选项。
我不确定你为什么要这样做,因为 bs4 会生成有效的 html,这会搞乱它,但你可以使用这个函数:
def closeVoidElements(html, voidEls=None, parser=None, pFormatter=None):
if type(voidEls) != list:
voidEls = [
'area', 'base', 'br', 'col', 'command', 'embed', 'wbr', 'img',
'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'hr'
] # void elements from https://www.w3.org/TR/2011/WD-html-markup-20110113/syntax.html#syntax-elements
html = BeautifulSoup(str(html), parser)
if voidEls: voidEls = set([t.name for t in html.find_all(voidEls)])
html = html.prettify()
for ve in voidEls:
html = html.replace(f'<{ve}', f'<{ve}_x').replace(f'{ve}>', f'{ve}_x>')
html = BeautifulSoup(html, parser).prettify(formatter=pFormatter)
for ve in voidEls:
html = html.replace(f'<{ve}_x', f'<{ve}').replace(f'{ve}_x>', f'{ve}>')
return html
并将其称为closeVoidElements(soup)
而不是soup.prettify()
。 (它基本上是在更改自闭合标签的标签名称,因此 bs4 无法识别它们,然后在将它们改回之前进行解析和美化。)
之前,曾经有一个selfClosingTags
arguments 用于 xml,但是已经停用了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.