HTML转JSON字符串怎么做?

使用JavaScript解析HTML字符串为DOM对象,遍历节点提取数据构建JavaScript对象,再通过JSON.stringify()方法转换为JSON字符串。

要将HTML转换为JSON字符串,需通过JavaScript解析DOM结构并递归映射为JSON对象,以下是详细步骤和代码示例:

HTML转JSON字符串怎么做?


核心实现原理

  1. DOM解析
    使用浏览器内置的DOMParser解析HTML字符串,生成结构化DOM树。
  2. 递归遍历节点
    将每个DOM节点转换为JSON对象,包含标签名、属性、子节点和文本内容。
  3. 处理特殊节点
    区分元素节点、文本节点、注释节点,确保完整转换。

完整代码实现

function htmlToJson(htmlString) {
  // 1. 解析HTML字符串为DOM文档
  const parser = new DOMParser();
  const doc = parser.parseFromString(htmlString, "text/html");
  // 2. 递归转换DOM节点为JSON
  function convertNode(node) {
    // 处理元素节点
    if (node.nodeType === Node.ELEMENT_NODE) {
      const attributes = {};
      // 提取所有属性
      for (const attr of node.attributes) {
        attributes[attr.name] = attr.value;
      }
      // 递归处理子节点
      const children = [];
      node.childNodes.forEach(child => {
        children.push(convertNode(child));
      });
      return {
        tag: node.tagName.toLowerCase(),
        attributes,
        children
      };
    }
    // 处理文本节点(非空文本)
    else if (node.nodeType === Node.TEXT_NODE && node.textContent.trim()) {
      return { text: node.textContent.trim() };
    }
    // 处理注释节点
    else if (node.nodeType === Node.COMMENT_NODE) {
      return { comment: node.textContent };
    }
    // 忽略其他节点类型
    return null;
  }
  // 3. 从根节点开始转换
  const rootNode = doc.body.firstChild;
  return rootNode ? convertNode(rootNode) : null;
}
// 使用示例
const html = `
  <div class="container" id="main">
    <h1>标题</h1>
    <p>段落文本</p>
    <!-- 注释 -->
    <ul>
      <li>列表1</li>
      <li>列表2</li>
    </ul>
  </div>
`;
const jsonData = htmlToJson(html);
const jsonString = JSON.stringify(jsonData, null, 2); // 格式化输出
console.log(jsonString);

关键步骤解析

  1. DOMParser解析HTML
    parser.parseFromString()将字符串转换为可操作的DOM文档对象。
  2. 节点类型判断
    • nodeType === 1:元素节点(如<div>
    • nodeType === 3:文本节点
    • nodeType === 8:注释节点
  3. 属性提取
    遍历node.attributes集合,将属性存入键值对对象。
  4. 子节点递归
    对每个子节点递归调用convertNode(),生成嵌套结构。
  5. 处理
    .trim()移除空白字符,避免无效文本节点。

输出JSON结构示例

{
  "tag": "div",
  "attributes": {
    "class": "container",
    "id": "main"
  },
  "children": [
    {
      "tag": "h1",
      "attributes": {},
      "children": [{ "text": "标题" }]
    },
    {
      "tag": "p",
      "attributes": {},
      "children": [{ "text": "段落文本" }]
    },
    { "comment": "注释" },
    {
      "tag": "ul",
      "attributes": {},
      "children": [
        {
          "tag": "li",
          "attributes": {},
          "children": [{ "text": "列表1" }]
        },
        {
          "tag": "li",
          "attributes": {},
          "children": [{ "text": "列表2" }]
        }
      ]
    }
  ]
}

注意事项

  1. 浏览器环境限制
    需在浏览器或支持DOMParser的环境(如Puppeteer)中运行。
  2. 复杂结构处理
    • 自闭合标签(如<img>)会正常解析为无子节点元素
    • 脚本标签<script>内容会以文本节点保留
  3. 性能优化
    深层嵌套HTML建议分块处理,避免递归栈溢出。
  4. 数据安全
    避免直接解析用户输入的HTML,防止XSS攻击(需先消毒)。

应用场景

  • 服务端渲染(SSR)数据脱水/注水结构化存储
  • 爬虫数据提取
  • 富文本编辑器内容转换

引用说明:本文代码基于MDN Web Docs的DOMParser APINode接口标准实现,遵循W3C DOM规范。

HTML转JSON字符串怎么做?

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/28095.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月17日 12:39
下一篇 2025年5月30日 16:32

相关推荐

  • HTML怎样快速创建表格?高效技巧一网打尽!

    使用HTML创建表格需掌握`、、、标签,以定义表格,创建行,定义表头,填充单元格数据,结合border`属性可快速生成基础表格结构。

    2025年5月29日
    400
  • 怎样消除HTML页面中的上下滑动效果?

    要消除HTML页面中的上下滑动效果,可通过CSS设置overflow: hidden;属性禁用滚动条,在body或目标容器添加该样式可隐藏滚动条并禁止滚动,若需保留横向滚动功能,可单独使用overflow-y: hidden;,此方法适用于固定页面布局或弹窗触发时锁定背景滚动场景。

    2025年5月29日
    400
  • 如何设置HTML页脚居左?

    要使HTML页脚居左,可通过CSS设置页脚容器的文本对齐或布局属性,常用方法包括: ,1. 为页脚添加 text-align: left; 强制文本内容居左。 ,2. 使用 float: left; 让页脚左浮动(需清除浮动避免布局问题)。 ,3. 通过Flexbox或Grid布局调整页脚在容器中的对齐方式(如 justify-content: flex-start;)。 ,4. 直接设置 margin-right: auto; 配合Flex布局实现左对齐。

    2025年6月13日
    000
  • HTML如何轻松添加6像素边框?

    在HTML中为元素添加6像素边框,可使用CSS的border属性,通过设置border: 6px solid #颜色值;实现,也可单独调整border-width为6px,并自定义样式(如solid/dashed)和颜色,支持对单边(border-left等)独立设置。

    2025年5月28日
    400
  • ASP.NET如何输出html

    ASP.NET通过服务器端技术动态生成HTML内容,开发者使用Razor语法在视图中嵌入C#代码,通过控制器处理逻辑并绑定数据,最终由ASP.NET引擎将.cshtml文件渲染为标准HTML输出至浏览器,Web Forms和MVC框架均提供内置HTML生成机制。

    2025年6月2日
    400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN