Convertir la lista HTML a una lista anidada de Python

Si tengo una lista html (no ordenada) anidada que se ve así:

 

¿Cómo formo una lista anidada de Python? Por ejemplo:

 ["https://stackoverflow.com/questions/24216263/converting-html-list-to-nested-python-list/Page1_Level1.html", ["https://stackoverflow.com/questions/24216263/converting-html-list-to-nested-python-list/Page1_Level2.html", ["Page1_Leve3.html", "https://stackoverflow.com/questions/24216263/converting-html-list-to-nested-python-list/Page2_Level3.html", "https://stackoverflow.com/questions/24216263/converting-html-list-to-nested-python-list/Page3_Level3.html"]], "https://stackoverflow.com/questions/24216263/converting-html-list-to-nested-python-list/Page2_Level1.html", ["https://stackoverflow.com/questions/24216263/converting-html-list-to-nested-python-list/Page2_Level2.html"]] 

Supongo que bibliotecas como Beautiful Soup y HTML Parser tienen facilidades para hacer esto, pero no he podido resolverlo. Gracias por cualquier ayuda / punteros!

Puedes tomar un enfoque recursivo:

 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) 

Huellas dactilares:

 [{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': []}]}] 

Para su información, aquí es por qué tuve que usar html.parser aquí:

  • No coloque tags html, cabeza y cuerpo automáticamente, beautifulsoup

Es un resumen de una posible solución.

 # 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