显示嵌套python字典中的HTML列表



我得到了以下Python字典:

d = {'DataType': 'XY', 'DataReportGrp': {'NoSides_1': {'Side': '2', 'Reports': {'NoReportIDs_1': {'ReportID': '250001'}, 'NoReportIDs_2': {'ReportID': '250002'}}}}}

我想把它转换成一个类似于以下的HTML列表:

<li> DataType </li>
<li> DataReportGrp </li>
<ul>
<li> NoSides_1 </li>
<ul>
<li> Side </li>
<li> Reports </li>
<ul>
<li> NoReportIDs_1 </li>
<ul>
<li> ReportID </li>
</ul>
<li> NoReportIDs_2 </li>
<ul>
<li> ReportID </li>
</ul>
</ul>
</ul>
</ul>

我试着用下面的代码来做这件事。不幸的是,我不知道该实现什么逻辑来确定何时在正确的时间关闭</ul>组,而且这本字典将来可能会得到更多嵌套级别:

def nested_groups(levels):
groups = list()

def going_through(d):
if isinstance(levels, dict):
for kd, kv in d.items():
if isinstance(kv, dict):
groups.append(kd)
print(f" <li> --- {kd} </li>")
print(" <ul>")

going_through(kv)
else:
print(f" <li> --- {kd} </li>")

going_through(levels)
print("</ul>" * len(groups))

这导致:


<li> --- DataType </li>
<li> --- DataReportGrp </li>
<ul>
<li> --- NoSides_1 </li>
<ul>
<li> --- Side </li>
<li> --- Reports </li>
<ul>
<li> --- NoReportIDs_1 </li>
<ul>
<li> --- ReportID </li>
<li> --- NoReportIDs_2 </li>
<ul>
<li> --- ReportID </li>
</ul></ul></ul></ul></ul>

如有帮助,不胜感激。

您可以使用递归生成器函数:

d = {'DataType': 'XY', 'DataReportGrp': {'NoSides_1': {'Side': '2', 'Reports': {'NoReportIDs_1': {'ReportID': '250001'}, 'NoReportIDs_2': {'ReportID': '250002'}}}}}
def to_html(d, c = 0):
for a, b in d.items():
yield '{}<li>{}</li>'.format('   '*c, a)
if isinstance(b, dict):
yield '{}<ul>n{}n{}</ul>'.format('   '*c, "n".join(to_html(b, c + 1)), '   '*c)
print('n'.join(to_html(d)))

输出:

<li>DataType</li>
<li>DataReportGrp</li>
<ul>
<li>NoSides_1</li>
<ul>
<li>Side</li>
<li>Reports</li>
<ul>
<li>NoReportIDs_1</li>
<ul>
<li>ReportID</li>
</ul>
<li>NoReportIDs_2</li>
<ul>
<li>ReportID</li>
</ul>
</ul>
</ul>
</ul>

最新更新