You need to enable JavaScript to run this app. 如何高效将JavaScript JSON解析为Python字典(解决提取后格式无效问题)
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将JavaScript JSON解析为Python字典(解决提取后格式无效问题)

问题本质
  • 解析失败的核心原因是对页面内嵌脚本的转义层级理解存在偏差:页面中window.__REDUX_STATE__ = JSON.parse("...")的结构,相当于把完整的合法JSON做了一层JS字符串字面量转义后,作为参数传给JSON.parse再做还原。
  • 之前操作的核心错误是无差别删除所有反斜杠转义符,把本来用来包裹内容内嵌双引号的转义标记全部删掉,导致本应该是单条字符串的奖项文本被拆成了多个相邻字符串,直接触发JSON解析的分隔符校验错误。
  • 用Scrapy提取script文本的时候,工具本身不会主动解码JS层面的转义内容,如果跳过“先解码转义、再解析JSON”的步骤,直接把截出来的字符串喂给json.loads,必然会因为转义标记丢失导致解析失败。
可落地的修正方案
  • 第一步:缩小选择器范围,精准定位包含__REDUX_STATE__赋值逻辑的script块,避免泛化选择器抓到其他无关脚本内容。
  • 第二步:截取JSON.parse()方法的入参——也就是被双引号包裹的那段经过JS转义的字符串,注意不要因为源码里的换行、空格变化导致split切错位,非贪婪匹配比硬编码split边界的鲁棒性更强。
  • 第三步:绝对不要直接全局替换掉所有反斜杠。先把截出来的转义字符串按照JS字符串的转义规则解码,还原成真正的合法JSON文本,再调用标准JSON解析方法得到Python字典。
    这里不需要手动处理转义规则,Python内置的codecs模块可以直接完成JS字符串转义的解码;如果遇到JS宽松写法(比如对象末尾带逗号、单引号包裹键值)的兼容问题,可以换用专门的容错解析库处理,比自己写正则兼容各类边缘场景高效得多。
  • 修正后的可运行参考代码:
import requests
import json
import codecs
from scrapy.selector import Selector

headers = {
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3',
    'Accept-Language': 'en-US,en;q=0.5'
}

target_url = 'https://www.zocdoc.com/doctor/andrew-fagelman-md-7363?insuranceCarrier=-1&insurancePlan=-1'
response = requests.get(target_url, headers=headers)
selector = Selector(text=response.text)

parsed_redux = None
# 遍历所有script标签内容做匹配
for script_text in selector.css('script::text').getall():
    if '__REDUX_STATE__ = JSON.parse' not in script_text:
        continue
    # 定位JSON.parse的参数起点
    param_start = script_text.find('JSON.parse(') + len('JSON.parse(')
    raw_param = script_text[param_start:].strip()
    # 去掉参数外层包裹的双引号
    if raw_param.startswith('"'):
        raw_param = raw_param[1:]
    # 定位JS字符串的结束边界
    string_end = raw_param.find('");')
    escaped_json = raw_param[:string_end]
    # 先解码JS转义,还原真实JSON文本
    real_json = codecs.decode(escaped_json, 'unicode_escape')
    # 执行标准JSON解析
    parsed_redux = json.loads(real_json)
    break

print(type(parsed_redux))
常见避坑提示
  • 不要为了图省事直接执行.replace("\\", ""),这是这次解析报错的直接诱因——所有用来转义内层双引号的标记会被全部删掉,直接把连续的引号变成语法错误。
  • 如果页面结构有微调,硬编码的split切分很容易失效,可以用带非贪婪匹配的正则直接抓取转义后的JSON文本,比字符串分割的适配性更强。
  • 解析过程中如果遇到小范围的语法偏差,可以不用手动修每个错,用支持JS宽松语法的解析库直接处理,能大幅减少规则维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 16:36:03