[英]BeautifulSoup Prettify custom new line option
我正在使用BeautifulSoup構建xml文件。
看來我的兩個選項是1)沒有格式,即
<root><level1><level2><field1>val1</field1><field2>val2</field2><field3>val3</field3></level2></level1></root>
或2)與美化,即
<root>
<level1>
<level2>
<field1>
val1
</field1>
<field2>
val2
</field2>
<field3>
val3
</field3>
</level2>
</level1>
</root>
但我真的希望它看起來像這樣:
<root>
<level1>
<level2>
<field1>val1</field1>
<field2>val2</field2>
<field3>val3</field3>
</level2>
</level1>
</root>
我意識到我可以破解bs4來實現此結果,但我想聽聽是否存在任何選項。
我不太擔心4空格縮進(盡管那會很好),而對於任何結束標記之后或兩個開始標記之間的換行都比較煩惱。 我也很感興趣這種格式化方式,因為這對我來說似乎是最明智的方式。
您可以制作簡單的html.HTMLParser
來實現所需的功能:
from bs4 import BeautifulSoup
from html import escape
from html.parser import HTMLParser
data = '''<root><level1><level2><field1>val1</field1><field2>val2</field2><field3>val3</field3></level2></level1></root>'''
class MyHTMLParser(HTMLParser):
def __init__(self):
super().__init__()
self.__t = 0
self.lines = []
self.__current_line = ''
self.__current_tag = ''
@staticmethod
def __attr_str(attrs):
return ' '.join('{}="{}"'.format(name, escape(value)) for (name, value) in attrs)
def handle_starttag(self, tag, attrs):
if tag != self.__current_tag:
self.lines += [self.__current_line]
self.__current_line = '\t' * self.__t + '<{}>'.format(tag + (' ' + self.__attr_str(attrs) if attrs else ''))
self.__current_tag = tag
self.__t += 1
def handle_endtag(self, tag):
self.__t -= 1
if tag != self.__current_tag:
self.lines += [self.__current_line]
self.lines += ['\t' * self.__t + '</{}>'.format(tag)]
else:
self.lines += [self.__current_line + '</{}>'.format(tag)]
self.__current_line = ''
def handle_data(self, data):
self.__current_line += data
def get_parsed_string(self):
return '\n'.join(l for l in self.lines if l)
parser = MyHTMLParser()
soup = BeautifulSoup(data, 'lxml')
print('BeautifulSoup prettify():')
print('*' * 80)
print(soup.root.prettify())
print('custom html parser:')
print('*' * 80)
parser.feed(str(soup.root))
print(parser.get_parsed_string())
印刷品:
BeautifulSoup prettify():
********************************************************************************
<root>
<level1>
<level2>
<field1>
val1
</field1>
<field2>
val2
</field2>
<field3>
val3
</field3>
</level2>
</level1>
</root>
custom html parser:
********************************************************************************
<root>
<level1>
<level2>
<field1>val1</field1>
<field2>val2</field2>
<field3>val3</field3>
</level2>
</level1>
</root>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.