2013-07-25 7 views
4

Мне нужно разобрать вложенный HTML-список и преобразовать его в child-child. Учитывая этот список:Анализ вложенного HTML-списка с помощью BeautifulSoup

<ul> 
    <li>Operating System 
    <ul> 
     <li>Linux 
     <ul> 
      <li>Debian</li> 
      <li>Fedora</li> 
      <li>Ubuntu</li> 
     </ul> 
     </li> 
     <li>Windows</li> 
     <li>OS X</li> 
    </ul> 
    </li> 
    <li>Programming Languages 
    <ul> 
     <li>Python</li> 
     <li>C#</li> 
     <li>Ruby</li> 
    </ul> 
    </li> 
</ul> 

Я хочу, чтобы преобразовать его в Словаре, как это:

{ 
    'Operating System': { 
     'Linux': { 
      'Debian': None, 
      'Fedora': None, 
      'Ubuntu': None, 
     }, 
     'Windows': None, 
     'OS X': None, 
    }, 
    'Programming Languages': { 
     'Python': None, 
     'C#': None, 
     'Ruby': None, 
    } 
} 

Моя первая попытка с помощью find_all('li', recursive=False). Он возвращает элементы верхнего уровня (операционная система и языки программирования), а также дети.

Как это сделать с помощью BeautifulSoup?

ответ

7

Вот один из способов:

def dictify(ul): 
    result = {} 
    for li in ul.find_all("li", recursive=False): 
     key = next(li.stripped_strings) 
     ul = li.find("ul") 
     if ul: 
      result[key] = dictify(ul) 
     else: 
      result[key] = None 
    return result 

Пример использования:

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(""" 
... <ul> 
... <li>Operating System 
...  <ul> 
...  <li>Linux 
...   <ul> 
...   <li>Debian</li> 
...   <li>Fedora</li> 
...   <li>Ubuntu</li> 
...   </ul> 
...  </li> 
...  <li>Windows</li> 
...  <li>OS X</li> 
...  </ul> 
... </li> 
... <li>Programming Languages 
...  <ul> 
...  <li>Python</li> 
...  <li>C#</li> 
...  <li>Ruby</li> 
...  </ul> 
... </li> 
... </ul> 
... """) 
>>> ul = soup.body.ul 
>>> from pprint import pprint 
>>> pprint(dictify(ul), width=1) 
{u'Operating System': {u'Linux': {u'Debian': None, 
            u'Fedora': None, 
            u'Ubuntu': None}, 
         u'OS X': None, 
         u'Windows': None}, 
u'Programming Languages': {u'C#': None, 
          u'Python': None, 
          u'Ruby': None}} 
Смежные вопросы