Python爬虫抓取新蛋显卡页图片title报NoneType不可下标错误如何解决
问题排查与解答
错误原因
- 你抓取的
containers列表里不全是正常的商品卡片,新蛋分类页会插入广告位、运营推荐位、空占位模块等非商品元素,这些元素虽然也匹配div.item-container选择器,但内部DOM结构和正常商品不一样,有的缺失嵌套的div、a标签或者img节点,当循环执行到这类元素时,链式调用container.div.div.a.img中间某一步就会返回None,你再尝试取["title"]就会抛出NoneType不可取下标的错误。 - 你在循环外只测试了第一个元素
containers[0],刚好第一个位置是正常商品,DOM结构完整,所以能正常取值,但不代表列表里所有元素结构都一致。
解决方案
方案1:提前过滤无效容器
新蛋正常商品的item-container下都会有item-info类的节点,你可以在获取列表时直接过滤掉结构不完整的无效元素:
# 原获取containers的代码调整为: containers = page_soup.findAll("div",{"class":"item-container"}) # 过滤无商品信息的无效容器 valid_containers = [c for c in containers if c.find("div", {"class":"item-info"}) is not None] # 后续循环只遍历valid_containers即可
方案2:取值时增加空判断,避免硬编码链式调用
不要直接用连续的div.div.a这种强依赖结构的写法,改用find/select_one方法配合判断容错:
for container in containers: # 品牌取值容错 brand = "未知品牌" img_node = container.select_one("div div a img") if img_node and img_node.has_attr("title"): brand = img_node["title"] # 其余字段也用相同逻辑容错,避免索引越界错误 title_node = container.find("a", {"class":"item-title"}) product_name = title_node.text.strip() if title_node else "未知商品名" ship_node = container.find("li", {"class":"price-ship"}) shipping = ship_node.text.strip() if ship_node else "无配送信息" print(brand, product_name, shipping, sep="\n")
内容的提问来源于stack exchange,提问作者Arseny Matveev
相关产品推荐
相关产品推荐

