将 HTML 个嵌套列表拆分为 python 个列表

Split HTML nested list into python list

我有 HTML 列表以这种方式形成(这是 CKeditor 为嵌套列表创建的):

<ul>
    <li>niv1alone</li>
    <li>niv1
        <ul>
            <li>niv2
                <ul>
                    <li>niv3
                        <ul>
                            <li>niv4</li>
                            </ul></li></ul></li></ul></li>
    <li>autre niv1 alone</li>
</ul>

如何形成这样的“递归列表”:

[
    ('niv1alone',[]),('niv1',[('niv2',[('niv3',[('niv4',[])])])]),('autre niv1 alone',[])
]

我已经用 beautifulsoup 尝试了几件事,但我得不到想要的结果。

这是一个递归函数,其功能与您所要求的类似。编写递归函数的技巧是使问题变小然后递归。在这里,我沿着元素树走下去并传递子元素,这是一个比以前更小的集合。

import bs4

html = '''
<ul>
    <li>niv1alone</li>
    <li>niv1
        <ul>
            <li>niv2
                <ul>
                    <li>niv3
                        <ul>
                            <li>niv4</li>
                            </ul></li></ul></li></ul></li>
    <li>autre niv1 alone</li>
</ul>
'''


def make_tree(body: bs4.Tag):
    branch = []
    for ch in body.children:
        if isinstance(ch, bs4.NavigableString):
            # skip whitespace
            if str(ch).strip():
                branch.append(str(ch).strip())
        else:
            branch.append(make_tree(ch))
    return branch


if __name__ == '__main__':
    soup = bs4.BeautifulSoup(html, 'html.parser')
    tree = make_tree(soup.select_one('ul'))
    print(tree)

输出:

[['niv1alone'], ['niv1', [['niv2', [['niv3', [['niv4']]]]]]], ['autre niv1 alone']]