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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:45:19