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

如何用Python/BeautifulSoup获取<option>的data-inventory-quantity属性值

解决BeautifulSoup获取

问题说明

作为Python/BeautifulSoup新手,需要批量处理多个URL,提取每个页面中第一个<option>标签的data-inventory-quantity属性值(示例中为60)。由于每个URL的<option>标签value属性唯一,无法通过指定value定位;尝试通过上层<select id="variant-listbox">标签直接获取该属性时,出现KeyError: 'data-inventory-quantity'错误。

目标HTML片段:

<select id="variant-listbox">
  <option
    data-sku=""
    selected="selected"  value="40323576791107"
    data-inventory-quantity="60"
  >
    Regular - $75.00
  </option>
  <option
    data-sku=""
    value="40323576823875"
    data-inventory-quantity="4"
  >
    Variant - $100.00
  </option>
</select>

解决方案

出现KeyError是因为直接通过.attrs['data-inventory-quantity']访问属性时,若标签不存在该属性会直接报错。正确做法:

  1. 先通过上层<select id="variant-listbox">定位到目标下拉框
  2. 获取该下拉框下的所有<option>标签列表,取第一个
  3. 用.get()方法安全获取属性(属性不存在时返回指定默认值,避免报错)

补全后的完整代码

import requests
import bs4
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
import csv


def getTitle(soup):
    return soup.find('title').text

def getInventory(soup):
    # 定位目标select标签
    select_box = soup.find('select', id='variant-listbox')
    if not select_box:
        return 'N/A'
    # 获取第一个option标签
    first_option = select_box.find('option')
    if not first_option:
        return 'N/A'
    # 安全获取属性,不存在则返回N/A
    return first_option.get('data-inventory-quantity', 'N/A')

def getPrice(soup):
    price_meta = soup.find("meta", {"property": "og:price:amount"})
    return price_meta.get('content', 'N/A') if price_meta else 'N/A'


urlList = []  # 填入你的批量URL列表

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['Title', 'Inventory', 'Price'])
    
    for url in urlList:
        try:
            html = urlopen(url)
        except HTTPError as e:
            print(f"HTTP错误:{e}")
            csv_output.writerow(['HTTP错误', 'N/A', 'N/A'])
        except URLError as e:
            print(f"URL错误:{e}")
            csv_output.writerow(['URL错误', 'N/A', 'N/A'])
        else:
            soup = bs4.BeautifulSoup(html.read(), 'html.parser')
            row = [getTitle(soup), getInventory(soup), getPrice(soup)]
            print(row)
            csv_output.writerow(row)

关键说明

  • 使用.find('option')直接获取第一个<option>标签,比find_all('option')[0]更高效,且避免列表为空时的索引错误
  • 用.get(属性名, 默认值)替代.attrs[属性名],可在属性不存在时返回默认值(如'N/A'),防止程序崩溃
  • 增加空值判断和异常处理,提升批量处理时的代码健壮性,避免单个URL报错中断整个任务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:00:35