如何用BeautifulSoup提取JSON格式<script>元素并解决属性错误
问题解决方法
错误原因
AttributeError: ResultSet object has no attribute 'text' 是因为 soup.findAll() 返回的是标签结果集(列表),直接对整个列表调用.text方法会报错,必须先从结果集中取出单个script元素,再获取它的文本内容。
修正后的代码
import json from bs4 import BeautifulSoup # 假设已获取页面HTML内容并存入html变量 soup = BeautifulSoup(html, 'html.parser') # 获取第一个符合条件的script标签(页面通常仅存在一个该类型标签) script_tag = soup.find('script', {'type':'application/ld+json'}) if script_tag: # 提取标签文本并清理多余空白字符,避免JSON解析失败 json_text = script_tag.get_text(strip=True) # 解析JSON数据 product_data = json.loads(json_text) # 获取model列表数据 product_models = product_data.get("model", []) # 示例1:收集所有不同的@type值 all_types = set() all_types.add(product_data.get("@type")) for model in product_models: all_types.add(model.get("@type")) # 同时提取Offer里的@type if model.get("offers"): for offer in model["offers"]: all_types.add(offer.get("@type")) print("所有@type值:", all_types) # 示例2:遍历每个ProductModel的详细信息 for model in product_models: print(f"类型:{model['@type']},颜色:{model['color']},价格:{model['offers'][0]['price']}€,库存:{model['offers'][0]['availability'].split('/')[-1]}") else: print("未找到application/ld+json类型的script标签")
代码说明
- 用
soup.find()替代soup.findAll(),直接定位单个目标标签(若页面存在多个同类标签,再用findAll遍历处理) get_text(strip=True)会自动去除文本首尾空白和换行,避免JSON解析时出现格式错误- 用字典的
get()方法获取值,可避免因键不存在引发的报错 - 可根据需求提取
@type对应的各类元素,比如Product、ProductModel、Offer、AggregateOffer等
内容的提问来源于stack exchange,提问作者Vaidas
相关产品推荐
相关产品推荐

