0

0

Python HTML内容到自定义JSON结构的转换教程

霞舞

霞舞

发布时间:2025-11-22 13:10:02

|

546人浏览过

|

来源于php中文网

原创

Python HTML内容到自定义JSON结构的转换教程

本教程旨在解决将html内容转换为特定json格式的需求,特别是当直接使用`html_to_json`等库无法满足自定义键值对和层级结构时。文章将深入探讨如何利用python的`beautifulsoup`库对html进行语义解析,提取所需文本信息,并将其重构为用户定义的json格式,包括嵌套的子元素,以实现更灵活和精确的数据转换。

在数据处理和Web抓取场景中,将HTML文档转换为结构化的JSON数据是一种常见需求。然而,许多现成的HTML到JSON转换库,如html_to_json,通常会生成一个反映HTML DOM(文档对象模型)结构的JSON表示,其中包含了大量的HTML标签信息,这往往与用户期望的、仅包含业务逻辑键值对的扁平或自定义层级结构不符。当需要从HTML中提取特定的文本内容,并将其组织成具有自定义key、value和child数组的JSON格式时,直接的DOM转换工具显得力不从心。此时,我们需要采用更精细的HTML解析方法。

理解问题:为何直接转换不适用

像html_to_json这样的库,其设计目的是将HTML的标签、属性和文本内容完整地映射到JSON结构中。例如,一个标签内的文本会被表示为{"span": [{"_value": "文本内容"}]}。这种方式保留了原始HTML的完整性,但当我们的目标是:

  1. 去除所有HTML标签,只保留纯文本内容。
  2. 根据HTML的语义结构(而非DOM结构)构建JSON,例如将标题、段落等作为独立的键值对。
  3. 创建自定义的层级关系,如child数组来表示嵌套内容。

此时,我们需要一个能够灵活导航HTML树、提取特定元素内容并手动构建JSON对象的工具。Python的BeautifulSoup库正是为此类任务而生。

解决方案:使用BeautifulSoup进行语义解析

BeautifulSoup是一个用于从HTML和XML文件中提取数据的Python库。它能够将复杂的HTML文档转换成一个Python对象,使得开发者可以方便地通过标签名、属性、CSS选择器等方式搜索、导航和修改解析树。

立即学习Python免费学习笔记(深入)”;

以下是使用BeautifulSoup实现HTML到自定义JSON转换的基本步骤:

  1. 加载HTML内容:将HTML文件读取为字符串。
  2. 创建BeautifulSoup对象:将HTML字符串解析为可操作的树结构。
  3. 定位目标元素:使用find(), find_all(), select()等方法查找需要提取数据的HTML元素。
  4. 提取数据:从定位到的元素中提取文本内容(.get_text())或属性值(['attribute_name'])。
  5. 构建自定义JSON结构:根据提取的数据和预期的JSON格式,手动创建Python字典和列表,最终转换为JSON字符串。

示例代码:构建自定义JSON结构

为了演示如何将HTML内容转换为如{"key": "1", "value": "内容", "child": []}这样的自定义JSON格式,我们将假设有一个结构化的HTML片段,其中包含带有特定标识(如data-key属性)的章节和子章节。

假设的HTML文件 (sample.html) 内容:




    文档标题


    

第一章

这是第一章的主要内容。

造好物
造好物

一站式AI造物设计平台

下载

可能还有其他描述。

第二章

这是第二章的主体内容。

第二章第一节

本节详细阐述了子内容A。

第二章第二节

本节详细阐述了子内容B。

第二章第二节第一小节

这是更深层次的细节。

Python代码实现:

import json
from bs4 import BeautifulSoup

def extract_structured_data_from_html(html_content):
    """
    从HTML内容中提取结构化数据,并转换为自定义JSON格式。
    此函数递归处理嵌套的章节。
    """
    soup = BeautifulSoup(html_content, 'html.parser')

    # 定义一个递归函数来处理嵌套结构
    def parse_section(element):
        data_list = []

        # 查找当前元素下的所有直接子章节
        # 这里我们假设'section', 'subsection', 'sub-subsection'是层级结构
        # 并且它们都包含一个'data-key'属性

        # 遍历当前层级的直接子元素,寻找符合条件的“章节”
        # 注意:这里需要根据实际HTML结构调整选择器
        # 例如,如果所有层级都用同一个class(如'item'),则需要更复杂的逻辑判断嵌套

        # 简化处理:查找当前element下的所有'div',并根据class或data-key判断层级
        # 为了演示,我们假设直接子div是下一级

        # 获取当前元素的所有文本内容(不包含子元素文本,需要更精确的控制)
        # 或者,我们可以从标题标签中获取value

        # 示例中,我们假设每个section/subsection/sub-subsection都有一个H标签作为标题

        # 查找当前元素下的直接子section/subsection/sub-subsection
        # 使用CSS选择器来获取直接子元素

        # 获取当前元素的直接文本内容(排除子标签)
        # current_value = ' '.join(element.find_all(text=True, recursive=False)).strip()

        # 针对示例HTML结构进行解析
        # 优先从H标签中提取标题作为value
        title_tag = element.find(['h1', 'h2', 'h3'], recursive=False)
        value_text = title_tag.get_text(strip=True) if title_tag else ""

        # 获取当前层级的纯文本内容(不包含标题和子章节的文本)
        # 找到所有直接的

标签,并连接它们的文本 paragraph_texts = [p.get_text(strip=True) for p in element.find_all('p', recursive=False)] if paragraph_texts: value_text += "\n" + "\n".join(paragraph_texts) current_key = element.get('data-key') children = [] # 查找当前元素下的直接子 div,这些 div 可能是下一级章节 # 这里的逻辑需要根据HTML的实际嵌套方式来确定 # 例如,如果子章节总是紧跟在父章节的直接子div中 # 查找所有直接子 div,并判断它们是否是章节 direct_child_sections = element.find_all('div', recursive=False) for child_section in direct_child_sections: if child_section.has_attr('data-key'): # 确保是带有data-key的章节元素 children.extend(parse_section(child_section)) # 递归处理子章节 if current_key: data_list.append({ "key": current_key, "value": value_text.strip(), "child": children }) return data_list # 从body开始解析,查找所有顶层section top_level_sections = soup.body.find_all('div', class_='section', recursive=False) final_json_data = [] for section in top_level_sections: final_json_data.extend(parse_section(section)) return final_json_data # 读取HTML文件 html_file_path = "sample.html" with open(html_file_path, "r", encoding="utf-8") as f: html_data = f.read() # 转换数据 output_structured_json = extract_structured_data_from_html(html_data) # 将结果保存到JSON文件 output_json_file_path = "structured_output.json" with open(output_json_file_path, "w", encoding="utf-8") as outfile: json.dump(output_structured_json, outfile, indent=4, ensure_ascii=False) print(f"结构化JSON已保存到:{output_json_file_path}") print(json.dumps(output_structured_json, indent=4, ensure_ascii=False))

预期的输出 (structured_output.json):

[
    {
        "key": "1",
        "value": "第一章\n这是第一章的主要内容。\n可能还有其他描述。",
        "child": []
    },
    {
        "key": "2",
        "value": "第二章\n这是第二章的主体内容。",
        "child": [
            {
                "key": "2.1",
                "value": "第二章第一节\n本节详细阐述了子内容A。",
                "child": []
            },
            {
                "key": "2.2",
                "value": "第二章第二节\n本节详细阐述了子内容B。",
                "child": [
                    {
                        "key": "2.2.1",
                        "value": "第二章第二节第一小节\n这是更深层次的细节。",
                        "child": []
                    }
                ]
            }
        ]
    }
]

注意事项与最佳实践

  1. 了解HTML结构:在编写解析代码之前,务必仔细检查目标HTML文档的结构。了解标签的嵌套关系、类名、ID或自定义属性是成功提取数据的关键。
  2. 选择合适的解析器:BeautifulSoup支持多种解析器,如html.parser(Python内置)、lxml(速度快,功能强大)和html5lib(容错性好)。根据HTML的质量和性能要求选择。
  3. 精确选择器:使用find(), find_all(), select()方法时,尽量使用最精确的选择器来定位元素,避免意外捕获不相关的元素。CSS选择器(select())通常非常强大和灵活。
  4. 处理文本内容:.get_text(strip=True)方法可以获取元素的纯文本内容并去除首尾空白。如果需要保留内部的换行符或空格,可以调整参数。对于复杂的文本提取,可能需要遍历元素的contents或children。
  5. 错误处理:在实际应用中,HTML结构可能不总是完美的。在尝试访问元素的属性或文本之前,最好检查元素是否存在(例如,if element:)。
  6. 性能考虑:对于非常大的HTML文件,BeautifulSoup可能会占用较多内存。如果性能是关键因素,可以考虑使用lxml直接进行XPath或CSS选择器查询,或者分块处理HTML。
  7. 递归解析:对于嵌套的HTML结构,如示例中的章节和子章节,递归函数是处理层级关系的最佳方式。

总结

将HTML内容转换为自定义的JSON格式,不仅仅是简单的结构转换,更是一种语义提取和数据重构的过程。虽然html_to_json等库能提供DOM层面的JSON表示,但当需求涉及到去除标签、提取特定文本并构建自定义层级结构时,BeautifulSoup结合Python的灵活性,提供了强大而精确的解决方案。通过理解HTML结构、运用合适的选择器和递归处理方法,开发者可以高效地将非结构化的HTML数据转化为满足特定业务需求的结构化JSON数据。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

753

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

707

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号