如何用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']访问属性时,若标签不存在该属性会直接报错。正确做法:
- 先通过上层
<select id="variant-listbox">定位到目标下拉框 - 获取该下拉框下的所有
<option>标签列表,取第一个 - 用
.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
相关产品推荐
相关产品推荐

