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

Python爬取大学课程表:提取API响应JS函数内的events数据

解决方案:提取JS函数中的events数组(无Selenium)

方法1:正则提取 + JSON5解析

先通过正则定位到getEventData函数内的events数组片段,再用JSON5库兼容JS的语法特性(比如单引号、引号嵌套)来解析成Python列表。

  1. 安装JSON5库:pip install json5
  2. 代码示例:
import re
import json5

# 假设已获取的<script>标签内容存在script_content变量中
pattern = re.compile(r'function getEventData\(\) \{.*?events:\s*(.*?)\s*,?\s*[\}\)]', re.DOTALL)
match = pattern.search(script_content)
if match:
    events_js_str = match.group(1)
    # 用JSON5解析JS格式的数组,自动处理引号嵌套、单引号等问题
    events_list = json5.loads(events_js_str)
    # events_list即为Python字典列表,可直接用于存入数据库

方法2:用js2py直接执行JS代码提取数据

js2py是纯Python实现的JS解释器,可直接运行目标JS代码,无需浏览器环境,直接提取events变量。

  1. 安装js2py:pip install js2py
  2. 代码示例:
import js2py

# 移除<script>标签,保留纯JS代码
js_code = script_content.replace('<script>', '').replace('</script>', '')

# 执行JS代码,获取上下文环境
context = js2py.EvalJs()
context.execute(js_code)

# 若events是getEventData函数内部变量,可修改JS代码暴露变量
# 比如在js_code末尾添加:`window.events = events;`
events_list = context.events

方法3:手动修复语法后用标准JSON解析

如果不想依赖第三方库,可通过正则替换将JS数组转为标准JSON格式:

  • 给无引号的属性名添加双引号
  • 处理单引号与转义字符的转换
  • 移除数组末尾的多余逗号

代码示例:

import re
import json

script_content = "你的<script>标签内容"
pattern = re.compile(r'events:\s*(.*?)\s*,?\s*[\}\)]', re.DOTALL)
match = pattern.search(script_content)
if match:
    events_js_str = match.group(1)
    # 给属性名添加双引号
    events_js_str = re.sub(r'(\w+):', r'"\1":', events_js_str)
    # 将未转义的单引号替换为双引号
    events_js_str = re.sub(r"(?<!\\)'", '"', events_js_str)
    # 移除数组/对象末尾的多余逗号
    events_js_str = re.sub(r',\s*([\}\]])', r'\1', events_js_str)
    # 用标准JSON解析
    events_list = json.loads(events_js_str)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:10:05