使用 BeautifulSoup 解析嵌套的 HTML 列表 [英] Parsing nested HTML list with BeautifulSoup

查看:19
本文介绍了使用 BeautifulSoup 解析嵌套的 HTML 列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要解析嵌套的 HTML 列表并将其转换为父子字典.鉴于此列表:

    <li>操作系统<ul>
  • Linux<ul><li>Debian</li><li>Fedora</li><li>Ubuntu</li>
<li>窗口</li><li>OS X</li><li>编程语言<ul><li>Python</li><li>C#</li><li>红宝石</li>

我想把它转换成这样的字典:

<代码>{'操作系统': {Linux":{'Debian':无,'Fedora':无,'Ubuntu':无,},'Windows':无,OS X":无,},'编程语言': {'Python':无,'C#':无,'红宝石':无,}}

我最初的尝试是使用 find_all('li', recursive=False).它返回顶级项目(操作系统和编程语言)以及子项.

我怎样才能用 BeautifulSoup 做到这一点?

解决方案

这是一种方法:

def dictify(ul):结果 = {}对于 ul.find_all("li", recursive=False) 中的 li:键 = 下一个(li.stripped_strings)ul = li.find("ul")如果你:结果[键] = dictify(ul)别的:结果[键] = 无返回结果

示例使用:

<预><代码>>>>从 bs4 导入 BeautifulSoup>>>汤 = BeautifulSoup("""... <ul>... <li>操作系统... <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>编程语言... <ul>... <li>Python</li>... <li>C#</li>... <li>Ruby</li>... </ul>... </li>... </ul>... """)>>>ul = 汤.body.ul>>>从 pprint 导入 pprint>>>pprint(dictify(ul),宽度= 1){u'操作系统':{u'Linux':{u'Debian':无,u'Fedora':无,你'Ubuntu':无},u'OS X':无,u'Windows': 无},u'编程语言':{u'C#':无,你'Python':无,你'Ruby':无}}

I need to parse a nested HTML list and convert it to a parent-child dict. Given this list:

<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>

I want to convert it to a dict like this:

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

My initial attempt is using find_all('li', recursive=False). It returns the top level items (Operating System and Programming Languages) but also the children.

How can I do it with BeautifulSoup?

解决方案

Here's one way:

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

Example use:

>>> 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}}

这篇关于使用 BeautifulSoup 解析嵌套的 HTML 列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆