美丽的汤&蟒蛇。无法通过递归来获取所有节点,因为在调用Python对象时会超过最大递归深度"错误

时间:2014-04-07 01:45:52

标签: python recursion beautifulsoup mindmapping

我在FreeMind程序中工作,它允许创建树并将它们作为HTML文件导入,我需要获取此树的每个“路径”并将它们放入列表中,例如分别处理每个“路径”。 enter image description here

例如,从以下代码:

<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表的工具,例如所有测试用例。但是现在我只想把所有测试用例都作为文本。

1 个答案:

答案 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

希望有所帮助。