You need to enable JavaScript to run this app. Python如何解析从HTML脚本中提取的非规范格式JSON对象
优惠活动
大模型
产品
解决方案
定价
更多

Python如何解析从HTML脚本中提取的非规范格式JSON对象

非标准内嵌JS对象的自动化解析方案

针对JSON解析报属性名缺双引号、YAML解析器被制表符触发报错的场景,无需手动重构大体积字符串,按以下三步线性处理即可完成结构化解析:

  • 预处理清理结构干扰字符
    直接把原始字符串中混在结构中、易触发YAML ScannerError的制表符(\t)统一替换为2个空格。该操作不破坏JS对象本身的语法结构,可直接解决制表符触发的解析报错。
  • 批量为对象属性补双引号
    用正则匹配所有不在字符串包裹范围内、位于{或,之后的合法属性标识符(字母、数字、下划线、$、连字符组成的连续字符串,后续紧跟冒号),自动给匹配到的属性名包裹双引号。例如原字符串中的a: 1会被自动替换为"a": 1,完全符合JSON对属性名的格式要求。
  • 批量删除结构内的尾随逗号
    用正则匹配}或]前面紧跟的多余逗号,直接删除。这类逗号是JS对象字面量支持但JSON不兼容的语法(比如示例中c: 3后面紧跟}的那个逗号),删除后即可生成完全符合JSON规范的字符串。

可直接复用的核心处理代码:

import json
import re

def parse_nonstandard_js_obj(raw_str: str) -> dict:
    # 清理制表符避免解析器报错
    processed = raw_str.replace("\t", "  ")
    # 为非字符串上下文的属性名补双引号
    processed = re.sub(
        r'([{,]\s*)([a-zA-Z0-9_$-]+)\s*:',
        r'\1"\2":',
        processed
    )
    # 删除对象/数组结构中的尾随逗号
    processed = re.sub(r',\s*([}\]])', r'\1', processed)
    return json.loads(processed)

# 验证示例场景
test_case = "{a: 1,b: 2,c: 3,}"
parsed_result = parse_nonstandard_js_obj(test_case)
# 正常读取属性值
assert parsed_result["a"] == 1

大体积场景适配说明

  • 所有正则替换逻辑为单次线性扫描,时间复杂度与字符串长度正相关,哪怕是数MB级的大体积对象字符串,也能在毫秒级完成处理,不存在手动重构字符串的效率瓶颈。
  • 如果碰到属性名带特殊字符的场景,只需调整正则中属性标识符的匹配规则,不需要修改整体处理流程。

内容的提问来源于stack exchange,提问作者wongx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 21:06:02