作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 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>
关于python - BeautifulSoup 美化自定义换行选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831984/
在 Vaadin 7.0,显示时JavaBean Table 中的数据与 BeanContainer ,用新数据刷新表的正确方法是什么? 最佳答案 该表通过监听器监视表项的属性。如果您通过表的 Ite
首先,我使用的是带有 Axis2 1.6.2 的 eclipse,我正在 tomcat 6 上部署我创建的 Web 服务。Web 服务是在 eclipse 中通过自上而下的方法创建的。 我被要求使对我
我已将 Rails 3.1.1 应用程序升级到 Rails 3.1.3,现在,对于每个请求,它仅响应错误数量的参数(3 for 1)。不幸的是,它没有说明错误在哪里,并且应用程序跟踪为空。我认为存在一
我是一名优秀的程序员,十分优秀!