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

Python网页爬虫作业代码有输出但报错,请问问题出在哪里

问题定位

你遇到的是索引越界错误(IndexError),触发的核心原因如下:

  • 循环次数是基于containers = soup.findAll("a", {"class":"product-item-link"})的长度,但每次循环都从整个页面全局搜索所有价格、商品名称元素,这三类元素的查询结果长度不一定相等:比如部分商品没有标注上架价格、页面其他区域(如页脚、推荐栏)存在额外的price/商品名称元素,都会出现price_container或者product_container的长度和containers不一致,当循环变量i超过较短的列表长度时就会触发索引越界。
  • 重复全局查询DOM效率很低,每次循环都要遍历整个页面结构,属于不必要的性能损耗。
修复方案

推荐优化后的代码如下:

import csv

# 用with上下文管理自动处理文件关闭,避免异常场景下文件未关闭
with open("hp_products.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    # 写入表头
    writer.writerow(["price", "product"])
    # 先定位所有商品的父容器(一般商品区块都有统一的父节点类名,可根据实际页面调整class值)
    product_items = soup.findAll("div", {"class": "product-item"})
    for item in product_items:
        # 从单个商品节点内查询对应元素,保证价格和商品一一对应
        price_ele = item.find("span", {"class": "price"})
        product_ele = item.find("strong", {"class": "product name product-item-name"})
        # 增加判空逻辑,兼容元素缺失的场景
        price = price_ele.text.strip().replace(",", "") if price_ele else ""
        product = product_ele.text.strip() if product_ele else ""
        print("price: ", price)
        print("product: ", product)
        writer.writerow([price, product])

本次优化点:

  • 从单个商品父节点内部查询子元素,完全避免全局匹配导致的元素对应错误
  • 增加元素判空逻辑,兼容部分商品缺失价格/名称的场景
  • 使用Python内置的csv模块处理文件写入,避免手动处理逗号分隔符引发的csv格式错误
  • 用with上下文管理文件操作,无需手动调用close(),程序异常退出也不会出现资源泄露问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:54:03