You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何提取JS文件中存储的变量并转为可下标访问的字典

解决方案

核心思路

直接open()得到的是文件IO对象,read()得到的是原始字符串,两者都没有做结构化解析,自然无法像字典一样访问。标准json模块仅能解析严格JSON格式内容,无法直接识别JS源码中的对象字面量语法(无引号键名、单引号、尾逗号等),不需要写全量正则做内容解析,用两步就能拿到可直接下标访问的Python字典:

  • 从JS文本中定位到county_info对应的对象片段
  • 用支持JS对象语法的解析库将片段转为Python原生字典

方案1:轻量实现(推荐,99%场景可用)

用json5库做解析,它兼容绝大多数JS对象字面量语法,依赖轻量、解析速度快。

  • 先安装依赖:
pip install json5
  • 实现代码:
import json5

# 读取JS文件内容
with open(r'C:\file.js', 'r', encoding='utf-8') as f:
    js_text = f.read()

# 定位county_info赋值起点
start_flag = "county_info = "
start_pos = js_text.find(start_flag) + len(start_flag)

# 用括号计数法定位对象结束位置,适配嵌套对象场景
bracket_level = 0
end_pos = start_pos
for idx in range(start_pos, len(js_text)):
    if js_text[idx] == "{":
        bracket_level += 1
    elif js_text[idx] == "}":
        bracket_level -= 1
        if bracket_level == 0:
            end_pos = idx + 1
            break

# 解析为Python字典
county_info = json5.loads(js_text[start_pos:end_pos])

# 验证类型、支持下标访问
print(type(county_info))  # 输出 <class 'dict'>
print(county_info["你的目标键名"])

说明:这里仅用字符串查找+括号计数定位片段,没有写复杂正则解析键值对,不会因为内容里有特殊字符、转义符出现匹配错误,鲁棒性远高于全量正则解析方案。


方案2:全语法兼容方案

如果JS文件里有json5不支持的特殊语法,可以用JS语法解析器直接把整个文件解析成语法树再提取数据,100%兼容标准JS语法。

  • 安装依赖:
pip install pyjsparser
  • 实现代码:
from pyjsparser import PyJsParser

def js_node_to_py(node):
    """递归将JS语法树节点转为Python原生数据结构"""
    if node["type"] == "ObjectExpression":
        res = {}
        for prop in node["properties"]:
            # 兼容标识符键、字符串键两种场景
            key = prop["key"].get("name", prop["key"].get("value"))
            res[key] = js_node_to_py(prop["value"])
        return res
    elif node["type"] == "Literal":
        return node["value"]
    elif node["type"] == "ArrayExpression":
        return [js_node_to_py(elem) for elem in node["elements"]]
    return None

with open(r'C:\file.js', 'r', encoding='utf-8') as f:
    js_text = f.read()

# 解析JS为语法树
parser = PyJsParser()
ast = parser.parse(js_text)

county_info = None
# 遍历语法节点找到county_info的声明
for node in ast["body"]:
    if node.get("type") == "VariableDeclaration":
        declare = node["declarations"][0]
        if declare["id"]["name"] == "county_info":
            county_info = js_node_to_py(declare["init"])
            break

# 直接下标访问即可
print(county_info["你的目标键名"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:54:20