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

如何从指定名称的Script提取键值对并解决NoneType属性错误

解决提取window.PRODUCT_SELECTION_BOOTSTRAP数据时的AttributeError错误

错误原因

出现AttributeError: 'NoneType' object has no attribute 'text'是因为你尝试访问的script标签对象为None(没找到目标标签),或者该标签没有文本内容,直接调用.text触发了错误。

解决方案

核心思路是先确保找到目标script标签,再提取数据,同时增加非空检查避免报错。以下是完整实现步骤:

1. 遍历并筛选目标script标签

用BeautifulSoup遍历所有script标签,先判断标签是否有文本内容,再检查是否包含目标变量名:

from bs4 import BeautifulSoup
import re
import json

# 替换为你的网页源码
html_content = """你的网页HTML内容"""

soup = BeautifulSoup(html_content, 'html.parser')
target_script_content = None

# 遍历所有script标签,做非空检查
for script in soup.find_all('script'):
    # 先判断script是否有文本内容,再检查是否包含目标变量
    if script.string and 'window.PRODUCT_SELECTION_BOOTSTRAP' in script.string:
        target_script_content = script.string
        break

2. 提取并解析数据

如果找到目标脚本,用正则匹配提取JSON格式的数据,再解析为Python字典:

if not target_script_content:
    print("未找到包含window.PRODUCT_SELECTION_BOOTSTRAP的脚本")
else:
    # 正则匹配赋值语句中的JSON数据(适配跨多行的情况)
    pattern = r'window\.PRODUCT_SELECTION_BOOTSTRAP\s*=\s*({.*?});'
    match_result = re.search(pattern, target_script_content, re.DOTALL)
    
    if match_result:
        # 解析JSON字符串为Python对象
        product_data = json.loads(match_result.group(1))
        # 输出提取到的键值数据
        print(product_data)
    else:
        print("未能从脚本中提取到有效数据")

关键注意事项

  • 非空检查优先:必须先判断script.string是否存在,再进行后续操作,避免访问None的属性。
  • 正则适配多行:使用re.DOTALL参数让正则中的.匹配换行符,应对脚本中JSON数据跨多行的情况。
  • 灵活调整正则:如果目标数据的赋值格式不同(比如没有末尾分号),可以修改正则表达式,例如去掉末尾的;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:01:08