python:将字典序列化为简单的html输出


问题内容

使用应用程序引擎-是的,我对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)

它将dict转换成无序列表,现在可以了。一些CSS,也许稍作调整,应使其可读。

我将奖励编写上述代码的人的答案,由于无序列表未嵌套,我进行了一些小更改。我希望所有人都同意,所提供的许多解决方案都证明是有用的。但是,即使是粗略的代码,上面的代码也呈现了字典的真实html表示。


问题答案:

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'}}

这是不是 漂亮,但它至少说明以更结构化的方式的数据。