如何用BeautifulSoup解析Glassdoor的script标签window.appCache并解决JSON解析错误
解决Glassdoor
window.appCache JSON解析失败问题 问题说明
你通过requests和BeautifulSoup提取Glassdoor页面的script标签内容,已定位到包含window.appCache的字符串,但调用json.loads()时触发JSONDecodeError。原因是拿到的字符串并非标准JSON格式——它是带window.appCache=前缀的JavaScript对象定义,还可能存在语法不严谨的情况(比如示例中"initialState"后缺失冒号)。
解决步骤及代码示例
要提取其中的"reviews":[]字段,需先处理字符串格式,再进行解析:
import requests from bs4 import BeautifulSoup import json import re # 请求页面 url = "https://www.glassdoor.com/Reviews/Alteryx-Reviews-E351220.htm" headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} html = requests.get(url, headers=headers) soup = BeautifulSoup(html.content,'html.parser') # 精准定位包含window.appCache的script标签(避免取错第一个标签) target_script = None for script in soup.find_all("script"): if "window.appCache" in script.text: target_script = script.text break if not target_script: print("未找到目标script标签") else: # 1. 剥离window.appCache=前缀,保留核心对象内容 raw_json = re.sub(r'^window\.appCache=', '', target_script) # 2. 修复常见的JS语法问题(比如示例中缺失的冒号、末尾多余逗号) raw_json = re.sub(r'"initialState"\s*{', '"initialState":{', raw_json) raw_json = re.sub(r',\s*([}\]])', r'\1', raw_json) # 3. 尝试用标准JSON解析 try: app_cache_data = json.loads(raw_json) # 提取reviews字段(注意路径是initialState下的reviews) reviews_list = app_cache_data.get("initialState", {}).get("reviews", []) print(f"成功提取{len(reviews_list)}条评论") if reviews_list: print("第一条评论示例:", reviews_list[0]) except json.JSONDecodeError as e: print(f"标准JSON解析失败:{e}") # 备用方案:用demjson解析JS对象(需先安装:pip install demjson) try: import demjson app_cache_data = demjson.decode(raw_json) reviews_list = app_cache_data.get("initialState", {}).get("reviews", []) print(f"用demjson成功提取{len(reviews_list)}条评论") except Exception as e: print(f"demjson解析也失败:{e}")
关键要点
- 不要直接取第一个script标签:页面中存在多个script,遍历匹配包含
window.appCache的标签更精准 - 剥离前缀是必须的:
window.appCache=不属于JSON语法,必须移除才能让解析器识别 - 处理JS语法差异:Glassdoor的前端代码可能存在不符合JSON规范的写法(如缺失冒号、末尾逗号),需用正则修复;如果修复后仍失败,
demjson库能直接解析JavaScript对象,兼容性更强
内容的提问来源于stack exchange,提问作者Dunc
相关产品推荐
相关产品推荐

