如何从指定名称的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
相关产品推荐
相关产品推荐

