Python:将字典序列化为简单的HTML输出

15 投票
9 回答
29660 浏览
提问于 2025-04-16 05:28

使用应用引擎 - 是的,我知道关于django模板和其他模板引擎的所有知识。

假设我有一个字典或者一个简单的对象,我不知道它的结构,我想把它转成HTML格式。

所以如果我有

{'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal'}}}

我想要的是把它以某种可读的HTML形式呈现出来,可以使用列表或表格;

data:
   id:1
   title:home
   address:
           street: some road
           city: anycity
           postal:somepostal

现在我知道我可以这样做

for key in dict.items
print dict[key]

但是这样做不能深入到子值中,也不能列出每个键值对,特别是当键/值是一个字典时,比如地址字典。

有没有什么轻量级、快速的Python模块可以很好地做到这一点?或者有没有人能分享一些简单的代码来实现这个功能。

解决方案

这里的所有解决方案都很有用。pprint无疑是打印字典的更稳定的方法,尽管它不能返回接近HTML的格式,但仍然可以打印。

我现在用的是这个:

def printitems(dictObj, indent=0):
    p=[]
    p.append('<ul>\n')
    for k,v in dictObj.iteritems():
        if isinstance(v, dict):
            p.append('<li>'+ k+ ':')
            p.append(printitems(v))
            p.append('</li>')
        else:
            p.append('<li>'+ k+ ':'+ v+ '</li>')
    p.append('</ul>\n')
    return '\n'.join(p)

它把字典转换成无序列表,这样暂时还可以。加点CSS和稍微调整一下应该就能让它更易读。

我打算奖励给写出上述代码的人,我做了一些小改动,因为无序列表没有嵌套。我希望大家都同意,很多提供的解决方案都很有用,但上面的代码确实能呈现字典的真实HTML表示,尽管有点粗糙。

9 个回答

6

这是我简单的解决方案,它可以处理任何层级的嵌套字典。

import json
temp_text = {'decision': {'date_time': None, 'decision_type': None},
             'not_received': {'date_time': '2019-04-15T19:18:43.825766'},
             'received': {'date_time': None},
             'rfi': {'date_time': None},
             'under_review': {'date_time': None}}
dict_text_for_html = json.dumps(
    temp_text, indent=4
).replace(' ', '&nbsp').replace(',\n', ',<br>').replace('\n', '<br>')

Python字典的HTML视图

7
import pprint


pprint.pprint(yourDict)

好吧,这里没有HTML,但和你用的for/print方法类似。

补充:或者可以使用:

niceText = pprint.pformat(yourDict)

这样做会给你相同的漂亮输出,所有的缩进等等。现在你可以逐行处理这些内容,并把它们格式化成HTML:

htmlLines = []
for textLine in pprint.pformat(yourDict).splitlines():
    htmlLines.append('<br/>%s' % textLine) # or something even nicer
htmlText = '\n'.join(htmlLines)
9

pyfunc做的例子可以很容易地修改,生成简单的嵌套html列表。

z = {'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal'}}}

def printItems(dictObj, indent):
    print '  '*indent + '<ul>\n'
    for k,v in dictObj.iteritems():
        if isinstance(v, dict):
            print '  '*indent , '<li>', k, ':', '</li>'
            printItems(v, indent+1)
        else:
            print ' '*indent , '<li>', k, ':', v, '</li>'
    print '  '*indent + '</ul>\n'

printItems(z,0)

当然,这样的列表看起来并不是特别好,但至少可以作为一个起点。如果你只是想把数据可视化,pprint模块其实就足够用了。你可以直接把pprint的结果用“pre”标签包裹起来,然后放到你的网页上。

pprint版本的结果大概是这样的:

import pprint
z = {'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal'}}}

print '<pre>', pprint.pformat(z), '</pre>'

而生成的html输出大概是这样的:

{'data': {'address': {'city': 'anycity',
                      'postal': 'somepostal',
                      'street': 'some road'},
          'id': 1,
          'title': 'home'}}

虽然看起来不是特别好,但至少能以更有结构的方式展示数据。

撰写回答