Mat*_*ien 4 html python json beautifulsoup html-parsing
我正在与BeautifulSoup合作,尝试解析一个看起来像这样的简单HTML文档:

(自然地,该结构以这种基本方式继续深入了几个层次。但是,偶尔会有一个额外的项目符号,它不提供任何信息,因此我想忽略它。)
我的目标是将其解析为JSON格式。
我希望最终结果如下所示:
{
"Outer List": {
"Inner List" : [
"info 1",
"info 2",
"info 3"
]
}
}
Run Code Online (Sandbox Code Playgroud)
下面的代码(非常感谢@Zero Piraeus)非常接近工作: 使用BeautifulSoup解析嵌套的HTML列表
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
Run Code Online (Sandbox Code Playgroud)
以下代码返回:
{u'Inner List': {u'Inner List': {u'info 1': None,
u'info 2': None,
u'info 3': None}},
u'Outer List': None}
Run Code Online (Sandbox Code Playgroud)
而我正在尝试达到:
{u'Outer List': {u'Inner List': [u'info 1',
'info 2',
'info 3']}
Run Code Online (Sandbox Code Playgroud)
我如何才能'info X'以合理合理的可扩展方式将项目作为值添加到列表中......而忽略那些可能出现的讨厌项目符号?
感谢您阅读本文!
这是一种实现方法:
from bs4 import BeautifulSoup
data = """your html goes here"""
soup = BeautifulSoup(data)
inner_ul = soup.find('ul', class_='innerUl')
inner_items = [li.text.strip() for li in inner_ul.ul.find_all('li')]
outer_ul_text = soup.ul.span.text.strip()
inner_ul_text = inner_ul.span.text.strip()
result = {outer_ul_text: {inner_ul_text: inner_items}}
print result
Run Code Online (Sandbox Code Playgroud)
印刷品:
{u'Outer List': {u'Inner List': [u'info 1', u'info 2', u'info 3']}}
Run Code Online (Sandbox Code Playgroud)