使用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
相关产品推荐
相关产品推荐

