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

使用BeautifulSoup根据HTML元素内容获取data-id属性报错求助

问题解决:通过HTML节点文本获取对应属性

错误原因

你遇到的'NoneType' object is not subscriptable(中文:'NoneType'对象不可下标访问)错误,是因为soup.find("option", {"option": " US 12"})未找到匹配元素,返回了None,随后你尝试对None访问["data-id"]属性,触发报错。

问题出在查找条件的写法:你用{"option": " US 12"}是在寻找带有option=" US 12"属性的<option>标签,但实际上你需要匹配的是<option>标签的文本内容为" US 12",而非属性。

正确实现方式

方法1:精确匹配文本

直接使用string参数指定要匹配的文本内容:

def carting():
    a = session.get(producturl, headers=headers, proxies=proxy)
    soup = BeautifulSoup(a.text, "html.parser")
    product_id = soup.find("div", {"class": "product-grid"})["data-product-id"]
    # 修正查找条件,匹配option标签的文本内容
    option = soup.find("option", string=" US 12")
    if option:
        option_id = option["data-id"]
        print(option_id)
    else:
        print("未找到匹配的尺码选项")
carting()

方法2:模糊匹配(处理文本空格/换行问题)

如果页面中<option>的文本存在多余空格或换行,可以用lambda函数处理文本后再匹配:

def carting():
    a = session.get(producturl, headers=headers, proxies=proxy)
    soup = BeautifulSoup(a.text, "html.parser")
    product_id = soup.find("div", {"class": "product-grid"})["data-product-id"]
    # 去除文本前后空白后匹配"US 12"
    option = soup.find("option", text=lambda text: text and "US 12" in text.strip())
    if option:
        option_id = option["data-id"]
        print(option_id)
    else:
        print("未找到匹配的尺码选项")
carting()

注意事项

  • 增加if option:的判断,避免后续访问属性时再次出现NoneType错误
  • 如果页面是动态加载的(比如尺码选项通过JS渲染),requests可能无法获取到完整的HTML,此时需要改用Selenium或Playwright等工具模拟浏览器加载页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:35:27