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
相关产品推荐
相关产品推荐

