使用 BeautifulSoup 从 HTML 创建 JSON 结构

Posted

技术标签:

【中文标题】使用 BeautifulSoup 从 HTML 创建 JSON 结构【英文标题】:Creating a JSON structure out of HTML with BeautifulSoup 【发布时间】: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 可序列化的 【参考方案1】:

这是一种方法:

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

打印:

u'Outer List': u'Inner List': [u'info 1', u'info 2', u'info 3']

【讨论】:

这太棒了!我想知道,考虑到它有更多的子列表,它是否可以概括为我可以在同一个列表中阅读? 您必须更具体:子列表在哪个列表中?外表还是内表等? 说,info 2 有一个子列表,在 HTML 中,info2_sublist_1info2_sublist_2info2_sublist_3 在它下面?既然这是 JSON,那么以 u'Outer List': u'Inner List': [u'info 1',info 2: ['info2_sublist_1', 'info2_sublist_2','info2_sublist_3]','info 3'] 结尾不是很好吗? 好的,谢谢你们的帮助!我在这里问了一个后续问题:***.com/questions/22672292/…

以上是关于使用 BeautifulSoup 从 HTML 创建 JSON 结构的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Python中的BeautifulSoup从HTML链接解析嵌套表?

BeautifulSoup:从 html 获取 css 类

如何使用 beautifulsoup 从 html 页面中抓取纬度/经度数据

使用python和BeautifulSoup从html中提取表格内容

python爬虫从入门到放弃之 BeautifulSoup库的使用

在 Python 中使用 BeautifulSoup 从 HTML 脚本标签中提取 JSON