python - 使用 BeautifulSoup 从 HTML 创建 JSON 结构

标签 python html json html-parsing beautifulsoup

我正在使用 BeautifulSoup,试图解析一个简单的 HTML 文档,如下所示:

enter image description here

(自然地,该结构继续以这种基本方式深入几层。但是,偶尔会有一个额外的项目符号,它不提供任何信息,因此我想忽略它。)

我的目标是将其解析为 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' 项目作为值放入列表中,以一种希望合理的可扩展方式....并忽略可能存在的那些讨厌的项目符号?

感谢您阅读到这里!

最佳答案

这是一种方法:

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']}}

关于python - 使用 BeautifulSoup 从 HTML 创建 JSON 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669777/

相关文章:

python - 如何合并和格式化列表

python - 当销毁 TreeView 时,我应该 'destroy' 一个列表存储( TreeView 的模型)吗?

Python Paramiko - 在退出之前等待传递的命令的更多输出

查看html嵌套列表时Android WebView加载空白

html - 表单容器中的对齐问题

python - 使用 HTTP GET 请求访问 nodejs 服务器上的 MongoDB 数据库

javascript - document.createElement();有我可以创建的元素列表吗?

python - 如何从 Python 中的 Pandas 数据框创建嵌套的 JSON 文件?

java - 解析 JSON 数组

c++ - 使用 Boost 库从 C++ 中的 JSON 中检索内容