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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:21:07