将HTML列表转换为嵌套的Python列表
如果我有一个嵌套的HTML无序列表,长得像这样:
<ul>
<li><a href="Page1_Level1.html">Page1_Level1</a>
<ul>
<li><a href="Page1_Level2.html">Page1_Level2</a>
<ul>
<li><a href="Page1_Level3.html">Page1_Level3</a></li>
</ul>
<ul>
<li><a href="Page2_Level3.html">Page2_Level3</a></li>
</ul>
<ul>
<li><a href="Page3_Level3.html">Page3_Level3</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="Page2_Level1.html">Page2_Level1</a>
<ul>
<li><a href="Page2_Level2.html">Page2_Level2</a></li>
</ul>
</li>
</ul>
我该如何在Python中把它变成一个嵌套的列表呢?比如说:
["Page1_Level1.html", ["Page1_Level2.html", ["Page1_Leve3.html", "Page2_Level3.html", "Page3_Level3.html"]], "Page2_Level1.html", ["Page2_Level2.html"]]
我想,像Beautiful Soup和HTML Parser这样的库应该有办法做到这一点,但我还没弄明白。谢谢任何帮助或建议!
2 个回答
1
这是一个可能解决方案的概述
# variable 'markup' contains the html string
from bs4 import BeautifulSoup
soup = BeautifulSoup(markup)
for a in soup.descendants:
# construct a nested list when going thru the descendants
print id(a), id(a.parent) if a.parent else None, a
4
你可以采用递归的方法:
from pprint import pprint
from bs4 import BeautifulSoup
text = """your html goes here"""
def find_li(element):
return [{li.a['href']: find_li(li)}
for ul in element('ul', recursive=False)
for li in ul('li', recursive=False)]
soup = BeautifulSoup(text, 'html.parser')
data = find_li(soup)
pprint(data)
输出结果:
[{u'Page1_Level1.html': [{u'Page1_Level2.html': [{u'Page1_Level3.html': []},
{u'Page2_Level3.html': []},
{u'Page3_Level3.html': []}]}]},
{u'Page2_Level1.html': [{u'Page2_Level2.html': []}]}]
顺便说一下,这里我为什么要使用 html.parser
: