Python 如何使用递归在BeautifulSoup中进行刮取?

Python 如何使用递归在BeautifulSoup中进行刮取?,python,recursion,beautifulsoup,Python,Recursion,Beautifulsoup,我正在尝试使用以下代码刮取一个xml文件,这些代码工作得非常好:- f = open("sample_data.xml", "r") contents = f.read() soup = BeautifulSoup(contents, features="xml") for component in soup.find_all("component"): for section in component.find_all("section"):

我正在尝试使用以下代码刮取一个xml文件,这些代码工作得非常好:-

    f = open("sample_data.xml", "r")
    contents = f.read()
    soup = BeautifulSoup(contents, features="xml")
    for component in soup.find_all("component"):
        for section in component.find_all("section"):
            for entry in section.find_all("entry"):
                for encounter in entry.find_all("encounter"):
                    for participant in encounter.find_all("participant"):
                        for participantRole in participant.find_all("participantRole"):
                            for playingEntity in participantRole.find_all("playingEntity"):
                                for name in playingEntity.find_all("name"):
                                    print(name.text)
但是我想把它放在一个递归中,而不是使用这么多for循环。为此,我创建了一个列表,作为查找所需元素的遍历路径,如下所示:-

traversal_path = ['component', 'section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['component', 'section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['encounter', 'participant', 'participantRole', 'playingEntity', 'name']
作为递归函数的断点,我们可以使用遍历路径的最后一项,在我们的例子中是
name
。当我们继续遍历
遍历路径时,列表中的第一项将被删除,直到只剩下最后一项。根据这一点,现在我的功能变成了这样:-

f = open("sample_data.xml", "r")
contents = f.read()
soup = BeautifulSoup(contents, features="xml")
traversal_path = ['component', 'section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']

def rec(traversal_path, soup):
    print(traversal_path)
    if len(traversal_path) == 1:
        for last_item in soup.find_all(traversal_path[0]):
            print(last_item.text)
    else:
        t = traversal_path.pop(0)
        for first_item in soup.find_all(t):
            return rec(traversal_path, first_item)

rec(traversal_path, soup)
我得到的输出就是如下打印的遍历路径:-

traversal_path = ['component', 'section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['component', 'section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['section', 'entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['entry', 'encounter', 'participant', 'participantRole', 'playingEntity', 'name']
['encounter', 'participant', 'participantRole', 'playingEntity', 'name']
当我打印
soup
而不是
遍历路径
时,我只会打印输出soup,直到
条目

另外,函数中的问题似乎出现在else部分,它没有进入递归。非常感谢在这件事上给予的任何帮助

 def rec(traversal_path, soup):
    if len(traversal_path) == 1:
        for last_item in soup.find_all(traversal_path[0]):
            print(last_item.text)
    else:
         try:
            for first_item in soup.find_all(traversal_path[0]):
                rec(traversal_path, first_item)
            t = traversal_path.pop(0)
        except Exception as e:
            pass

rec(field['traversal_path'].split(" "), soup)
只需删除return语句并处理异常