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

Python Scrapy如何获取JavaScript动态填充至HTML中的测验题完整内容

一次性提取10套听力测验数据的实现方法

方案1:Selenium执行JS直接提取(最便捷)

所有试题数据已经在页面加载时存入全局JS变量,不需要模拟点击流程,直接通过Selenium调用JS拿结构化数据即可:

  • 先在Chrome开发者工具的「控制台」标签调试定位存储试题的变量名:可以直接搜索某段听力原文的关键词,或者遍历window下的全局变量,找名称带test、question、quiz、listening的数组类型变量,假设定位到变量名为allConversationTests。
  • 在Selenium代码中调用execute_script方法直接返回该变量的序列化结果:
from selenium import webdriver
import json

driver = webdriver.Chrome()
driver.get("https://englishteststore.net/test/listening/conversation/hard/test60/index.html")
# 等待页面加载完成
driver.implicitly_wait(5)
# 执行JS获取数据,序列化后转Python字典
raw_data = driver.execute_script("return JSON.stringify(allConversationTests);")
test_data = json.loads(raw_data)
  • 拿到的test_data就是包含10套题的结构化数组,直接遍历就能拿到每套题的听力原文、题目、选项等所有字段,不需要额外解析HTML。

方案2:Scrapy解析页面Script标签提取

如果你已经用Scrapy拿到了完整的页面HTML,也可以直接从页面内嵌的JS代码里提取数据:

  • 用XPath筛选出包含试题数据的Script标签,用正则匹配提取出存储试题的JS对象字符串。
  • 用兼容JS对象语法的解析库(比如json5)转成Python字典,避免JS对象不符合标准JSON格式的问题:
import re
import json5
import scrapy

# response为Scrapy拿到的页面对象
script_content = response.xpath('//script[contains(text(), "question")]/text()').get()
# 正则匹配变量赋值语句,替换为你实际定位到的变量名
match_obj = re.search(r'allConversationTests\s*=\s*(.*?);\s*', script_content, re.S)
if match_obj:
    js_obj_str = match_obj.group(1)
    # 解析JS对象为Python字典
    test_data = json5.loads(js_obj_str)

校验规则

提取完成后先核对数据长度是否为10,随机抽取2-3套题的听力原文、选项和页面上显示的内容做比对,确认没有遗漏字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:06:09