我在FreeMind程序中工作,它允许创建树并将它们作为HTML文件导入,我需要获取此树的每个“路径”并将它们放入列表中,例如分别处理每个“路径”。
例如,从以下代码:
<body>
<p>Example</p>
<ul>
<li>
The First List
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</li>
<li>
The Second List
<ul>
<li>4.1</li>
<li>4.2</li>
</ul>
</li>
</ul>
</body>
我需要获得下一个单独的代码分支:
<body>
<p>Example</p>
<ul>
<li>
The First List
<ul>
<li>1</li>
</ul>
</li>
</ul>
</body>
<body>
<p>Example</p>
<ul>
<li>
The First List
<ul>
<li>2</li>
</ul>
</li>
</ul>
</body>
<body>
<p>Example</p>
<ul>
<li>
The First List
<ul>
<li>3</li>
</ul>
</li>
</ul>
</body>
<body>
<p>Example</p>
<ul>
<li>
The Second List
<ul>
<li>4.1</li>
</ul>
</li>
</ul>
</body>
<body>
<p>Example</p>
<ul>
<li>
The Second List
<ul>
<li>4.2</li>
</ul>
</li>
</ul>
</body>
我正在尝试该代码并获得错误“调用Python对象时超出了最大递归深度”:
from bs4 import BeautifulSoup
parsed = BeautifulSoup(open("example.html"))
body = parsed.body
def all_nodes(obj):
for node in obj:
print node
all_nodes(node)
print all_nodes(body)
我认为我应该在以后解释我想要做的所有这些事情。我正在FreeMind中编写测试用例,我正在尝试编写可以创建csv表的工具,例如所有测试用例。但是现在我只想把所有测试用例都作为文本。
答案 0 :(得分:2)
这是一种方法。虽然它并不那么简单和pythonic。我个人不喜欢这个解决方案,但对你来说这应该是一个好的开始。我敢打赌,有一种更美好,更短的方式来做同样的事情。
这个想法是迭代所有没有孩子的元素。对于每个这样的元素,递归遍历它的父节点,直到我们点击body
:
from bs4 import BeautifulSoup, Tag
data = """
your xml goes here
"""
soup = BeautifulSoup(data)
for element in soup.body.find_all():
children = element.find_all()
if not children:
tag = Tag(name=element.name)
tag.string = element.string
for parent in element.parentGenerator():
parent = Tag(name=parent.name)
parent.append(tag)
tag = parent
if tag.name == 'body':
break
print tag
它产生:
<body><p>Example</p></body>
<body><ul><li><ul><li>1</li></ul></li></ul></body>
<body><ul><li><ul><li>2</li></ul></li></ul></body>
<body><ul><li><ul><li>3</li></ul></li></ul></body>
<body><ul><li><ul><li>4.1</li></ul></li></ul></body>
<body><ul><li><ul><li>4.2</li></ul></li></ul></body>
UPD(写父母的文字):
soup = BeautifulSoup(data)
for element in soup.body.find_all():
children = element.find_all()
if not children:
tag = Tag(name=element.name)
tag.string = element.string
for parent in element.parentGenerator():
parent_tag = Tag(name=parent.name)
if parent.string:
parent_tag.string = parent.string
parent_tag.append(tag)
tag = parent_tag
if tag.name == 'body':
break
print tag
希望有所帮助。