如何从bs4获取的window.__INITIAL_STATE__中提取id和name生成字典
提取页面中groups数据的解决方案
实现步骤
要提取window.__INITIAL_STATE__里的groups.data["100"]数据并生成{id:name}格式的字典,需要先把JS对象转换为Python可处理的结构,具体操作如下:
- 提取JS对象字符串:从script标签文本中匹配出
window.__INITIAL_STATE__对应的JSON结构内容 - 转换为Python字典:用
json模块将提取到的字符串解析为Python字典 - 生成目标字典:遍历指定路径下的元素,提取
id和name字段组成新字典
完整代码
import requests from bs4 import BeautifulSoup import re import json url = "https://ruz.spbstu.ru/faculty/100/groups" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") scripts = soup.find_all('script') # 提取window.__INITIAL_STATE__对应的内容 script_content = scripts[3].text match = re.search(r'window.__INITIAL_STATE__ = (.*?);', script_content, re.DOTALL) if match: initial_state_str = match.group(1) # 解析为Python字典 initial_state = json.loads(initial_state_str) # 提取groups.data["100"]下的元素 groups_data = initial_state['groups']['data']['100'] # 生成{id:name}字典 result_dict = {item['id']: item['name'] for item in groups_data} print(result_dict) else: print("未找到window.__INITIAL_STATE__对象")
关键说明
- 正则表达式
r'window.__INITIAL_STATE__ = (.*?);'中的re.DOTALL参数允许.匹配换行符,确保能捕获完整的JS对象内容 - 若页面结构变化导致script标签索引不是3,需调整
scripts[3]的索引值 - 若出现JSON解析错误,可检查提取的字符串是否有JS特有的语法(如
undefined),必要时用字符串替换处理后再解析
内容的提问来源于stack exchange,提问作者Sasha Dynin
相关产品推荐
相关产品推荐

