2015-09-26 37 views
1

说我有一个任意名单:的Python:转换任意结构嵌套列表的HTML

qw = ['a', [['tag', '1'], ['tag', '2']]] 

我需要建立HTML与<blockquote>(只是一个Python字符串,列表中的每个元素应相应地包裹在标签到层次):

<blockquote> a 
    <blockquote> tag 
     <blockquote> 1 </blockquote> 
    </blockquote> 
    <blockquote> tag 
     <blockquote> 2 </blockquote> 
    </blockquote> 
</blockquote> 

结果:

render

比如我有一个字符串test='str1str2str34'和一些规则将其分割成列表:

['str1str2str34', [ 
    ['str1', ['str', '1']], 
    ['str2', ['str', '2']], 
    ['str34', ['str', '3', '4']] 
    ] 
] 

基于的渲染结果BLOCKQUOTE标签:

render3

所以,我试图改变递归发电机(用于展平列表):

def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, basestring): 
      for sub in flatten(el): 
       yield sub 
     else: 
      yield el 

但是真的没有什么c它的。

+0

'名单(压扁(QW))'。 – ekhumoro

回答

0

随着时间的推移,我已经找到了解决方案。

首先在我看来字典更适合这种情况。

为了节省,我们可以使用OrderedDict顺序:我们使用递归发电机

j = OrderedDict([ 
    ('str1str2str34', OrderedDict([ 
     ('str1', ['str', '1']), 
     ('str2', ['str', '2']), 
     ('str34', ['str', '3', '4']) 
    ])) 
]) 

解决这个任务:

tag = 'blockquote' 

def recurse(d, tag): 
    if isinstance(d, (dict, OrderedDict)): 
     for k in d: 
      yield '<' + tag + '>' + k 
      for sub in recurse(d[k], tag): 
       yield sub 
      yield '</' + tag + '>' 
    elif isinstance(d, (list, tuple)): 
     d = ['<{1}>{0}</{1}>'.format(el, tag) for el in d] 
     yield '<' + tag + '>' + ' '.join(d) + '</' + tag + '>' 

print '\n'.join(list(recurse(j, tag))) 

下面是美化HTML。

<blockquote>str1str2str34 
 
    <blockquote>str1 
 
     <blockquote> 
 
      <blockquote>str</blockquote> 
 
      <blockquote>1</blockquote> 
 
     </blockquote> 
 
    </blockquote> 
 
    <blockquote>str2 
 
     <blockquote> 
 
      <blockquote>str</blockquote> 
 
      <blockquote>2</blockquote> 
 
     </blockquote> 
 
    </blockquote> 
 
    <blockquote>str34 
 
     <blockquote> 
 
      <blockquote>str</blockquote> 
 
      <blockquote>3</blockquote> 
 
      <blockquote>4</blockquote> 
 
     </blockquote> 
 
    </blockquote> 
 
</blockquote>