【发布时间】:2014-05-05 12:31:37
【问题描述】:
我从一个简单的 HTML 结构开始,如下所示:
感谢@alecxe 的帮助,我能够创建这个 JSON 字典:
{u'Outer List': {u'Inner List': [u'info 1', u'info 2', u'info 3']}}
使用他的代码:
from bs4 import BeautifulSoup
data = """your html goes here: see the very end of post"""
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
代码很棒,我一直在尝试以可迭代的方式重写它。
我的“真实”HTML 数据集更大更糟糕,我需要以一种可以处理这样的方式来扩展代码:
或者,也许数据看起来是这样的:
更糟糕的是,也许在sublist 之下,我们还有另一个sublist!最终,这是我的真实情况。
我的问题是:我找不到一种方法来概括上述 BeautifulSoup 代码来处理上述任何一种情况(更不用说第三种“更糟糕”的情况了!)。
当我事先无法访问 HTML 的确切结构时,如何递归/迭代地探查 HTML 的深度并提取信息? BeautifulSoup 甚至可以做到这一点吗?当然,我肯定缺少某种方法,先确定深度,然后再继续。
非常感谢您能做到这一点!
最后一个例子的 HTML 在这里:
<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>
<ul class="grayStarUl">
<li class="">
<span class="phrasesToBeAdded">sublist</span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</body>
</html>
【问题讨论】:
-
见this。不过,我相信它在 Python 3.x 中。
-
谢谢!我已经尝试过了,恐怕它不能很好地解决我的特定问题。 (是的,它适用于 Python 3.x)
-
我不确定您要达到的目标。据我所知,您想从所有
中提取信息?事后保留结构重要还是数据本身就足够了? -
只是一个问题,
<ul>描述是否总是从第一个<li><span>元素获取?
标签: python html json parsing beautifulsoup