Python爬取大学课程表:提取API响应JS函数内的events数据
解决方案:提取JS函数中的events数组(无Selenium)
方法1:正则提取 + JSON5解析
先通过正则定位到getEventData函数内的events数组片段,再用JSON5库兼容JS的语法特性(比如单引号、引号嵌套)来解析成Python列表。
- 安装JSON5库:
pip install json5 - 代码示例:
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变量。
- 安装js2py:
pip install js2py - 代码示例:
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
相关产品推荐
相关产品推荐

