我有一个这样的清单:
lista = """
<ul>
<li>Arts & Entertainment
<ul>
<li>Celebrities & Entertainment News</li>
<li>Comics & Animation
<ul>
<li>Anime & Manga</li>
<li>Cartoons</li>
<li>Comics</li>
</ul>
</li>
</ul>
</li>
</ul>
"""
通过Beautiful Soup转换为这种元组和列表的组合:
[(u'Arts & Entertainment',
[u'Celebrities & Entertainment News',
(u'Comics & Animation',
[u'Anime & Manga', u'Cartoons', u'Comics'])])]
为了列出保留层次结构的所有元素,我尝试了这样的事情:
myLevel = 0
def orderList2(item):
global myLevel
for i in item:
if isinstance(i, str):
print str(myLevel) + " " + str(i.encode("utf-8")) + " tuple <br/>"
elif isinstance(i, tuple):
print str(myLevel) + " " + str(i[0].encode("utf-8")) + " tuple <br/>"
orderList2(item)
但它实际上并没有真正起作用......
你有什么建议吗?
感谢。
答案 0 :(得分:0)
您的助手功能不太对劲。尝试:
def orderList2(myLevel, item):
for i in item:
if isinstance(i, str):
print str(myLevel) + " " + str(i.encode("utf-8")) + " tuple <br/>"
elif isinstance(i, tuple):
visit(myLevel + 1, i)
打印出字符串,当它到达元组时,递增级别并打印出该元组中的字符串,直到它击中另一个元组,依此类推。不需要OP中的全局变量。
然后在你的顶级元组上调用它并让它进入城镇:
orderList2(0, item)
这使您可以在标记中处理任意深度的嵌套。
答案 1 :(得分:0)
尝试以下方法:
def orderList2(item, level=0):
for i in item:
if isinstance(i, basestring):
print level, i.encode('utf-8'), 'tuple <br />'
elif isinstance(i, tuple):
orderList2(i, level)
else:
orderList2(i, level+1)
以下是数据的输出:
>>> item = [(u'Arts & Entertainment', [u'Celebrities & Entertainment News', (u'Comics & Animation', [u'Anime & Manga', u'Cartoons', u'Comics'])])]
>>> orderList2(item)
0 Arts & Entertainment tuple <br />
1 Celebrities & Entertainment News tuple <br />
1 Comics & Animation tuple <br />
2 Anime & Manga tuple <br />
2 Cartoons tuple <br />
2 Comics tuple <br />
请注意,这不是使用全局级别变量,而是传递当前级别以在递归中使用。此外,在您的版本中,递归调用是orderList2(item)
,当您可能打算使用i
调用它时。而不是在元组中打印第一个项目,而是仅使用相同级别进行递归调用,并且使用列表将进行递归调用并递增级别。最后,它不会检查isinstance(i, str)
,而是检查basestring
,这是必要的,因为数据中的字符串是unicode。