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

