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

如何使用BeautifulSoup提取ld+json中offers字段的最后一个元素

提取offers字段最后一个元素的实现方法

你已经完成了页面请求和目标script标签定位,后续只需要做JSON解析、字段筛选即可,完整实现逻辑如下:

  • 导入Python内置json模块,用于将script标签内的JSON字符串转为可操作的字典结构
  • 遍历所有匹配到的application/ld+json类型script标签,提取标签内的文本内容
  • 解析JSON文本,筛选出@type为Product的结构化数据(页面通常会存在多个ld+json脚本,对应面包屑、站点信息等其他内容,需要过滤避免拿错数据)
  • 对offers字段对应的列表取最后一位索引即可拿到目标元素,Python中列表取末尾元素直接用[-1]索引

完整可运行代码

import json
from bs4 import BeautifulSoup

# 你原有页面请求逻辑
html = s.get(url=url, headers=headers, verify=False, timeout=15)
soup = BeautifulSoup(html.text, 'html.parser')
ld_json_scripts = soup.find_all('script', {'type': "application/ld+json"})

last_offer = None

for script in ld_json_scripts:
    # 去除文本首尾空白,避免JSON解析报错
    json_content = script.string.strip()
    try:
        json_data = json.loads(json_content)
        # 匹配Product类型的商品数据
        if json_data.get('@type') == 'Product' and 'offers' in json_data:
            offers = json_data['offers']
            # 兼容offers为单对象、数组两种场景
            if isinstance(offers, list):
                last_offer = offers[-1]
            else:
                last_offer = offers
            break
    except json.JSONDecodeError:
        # 跳过格式非法的JSON内容
        continue

# 输出提取到的最后一个offer元素
print(last_offer)

注意事项

  • 部分页面的offers字段可能不是数组而是单个Offer对象,上述代码已经做了类型兼容,不会触发索引报错
  • 如果提取结果为空,可以先打印所有解析到的ld+json内容,确认商品数据所在的脚本位置,调整筛选条件即可

内容的提问来源于stack exchange,提问作者Michał Majewski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.22 16:12:27