使用 BeautifulSoup 解析嵌套的 HTML 列表 [英] Parsing nested HTML list with BeautifulSoup
本文介绍了使用 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屋!
查看全文