【发布时间】:2014-05-05 08:57:51
【问题描述】:
我正在使用 BeautifulSoup,尝试解析如下所示的简单 HTML 文档:
(当然,这个结构在这个基本方式上继续深了几个层次。但是,偶尔会有一个额外的项目符号,它没有提供任何信息,因此我想忽略它。)
我的目标是将其解析为 JSON 格式。
我希望最终结果看起来像:
{
"Outer List": {
"Inner List" : [
"info 1",
"info 2",
"info 3"
]
}
}
下面的代码(感谢@Zero Piraeus)非常接近工作: Parsing nested HTML list with BeautifulSoup
from bs4 import BeautifulSoup
from pprint import pprint
soup = BeautifulSoup("""
<html>
<body>
<ul class="rootList">
<li class="liItem endPlus">
<span class="itemToBeAdded">
Outer List
</span>
</li>
<li class="noBulletsLi ">
<ul class="innerUl">
<li class="liItem crossPlus">
<span class="itemToBeAdded">
Inner List
</span>
<ul class="grayStarUl ">
<li class="">
<span class="phrasesToBeAdded">
info 1
</span>
</li>
<li class="">
<span class="phrasesToBeAdded">
info 2
</span>
</li>
<li class="">
<span class="phrasesToBeAdded">
info 3
</span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</body>
</html>
""")
ul = soup.body.ul
def dictify(ul):
result = {}
for li in ul.find_all("li", recursive=False):
list = []
key = next(li.stripped_strings)
ul = li.find("ul")
if ul:
result[key] = dictify(ul)
else:
result[key] = None
return result
这段代码返回:
{u'Inner List': {u'Inner List': {u'info 1': None,
u'info 2': None,
u'info 3': None}},
u'Outer List': None}
而我试图达到:
{u'Outer List': {u'Inner List': [u'info 1',
'info 2',
'info 3']}
我怎样才能将我的 'info X' 项目作为值放入列表中,以一种希望合理可扩展的方式......并忽略可能存在的那些讨厌的项目符号?
感谢您阅读本文!
【问题讨论】:
-
希望你不要再删除问题了。
-
我知道@alecxe,感谢您上次的评论。它激励我清理我的问题! :)
-
“BeautifulSoup”类型的对象不是 JSON 可序列化的
标签: python html json html-parsing beautifulsoup