Python BeautifulSoup爬取商品列表:循环获取全部商品名与价格
解决网页爬取循环获取所有商品的问题
Hey ScottCee, 我看到你刚开启Python网页爬取的学习之旅,现在卡在了获取River Island主分类页面所有商品的名称和价格上——当前代码只能拿到第一个商品,对吧?咱们一起把这个问题搞定!
问题根源
你当前代码里用了soup.find()方法,这个方法只会返回第一个匹配到的元素,所以自然只能拿到第一个商品的信息。要获取所有商品,咱们需要用soup.find_all()来定位页面上的所有商品容器,再逐个遍历提取信息。
修正后的完整代码
import requests from bs4 import BeautifulSoup # 目标页面URL url = 'https://www.riverisland.com/c/men/seasonal-offers?icid=mhp/winter-treats/m/seasonal-offers/cat' page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') # 初始化存储所有商品数据的列表 all_products = [] # 定位页面上所有的商品容器(查看页面源码后,每个商品都包裹在<article class="product">标签内) product_containers = soup.find_all('article', class_='product') # 遍历每个商品容器,提取对应信息 for container in product_containers: # 在当前商品容器内查找名称元素 name_box = container.find('div', class_='product__title ui-body-text') # 在当前商品容器内查找价格元素 price_box = container.find('div', class_='product-price__headline-product-price__headline--sale') # 加入判断:避免部分商品无名称/价格导致代码报错 if name_box and price_box: product_name = name_box.text.strip() product_price = price_box.text.strip() # 将商品信息以字典形式存入列表 all_products.append({ '商品名称': product_name, '商品价格': product_price }) # 打印所有商品信息(测试用) for idx, product in enumerate(all_products, 1): print(f"第{idx}个商品: {product['商品名称']} - {product['商品价格']}") # 后续导出示例(比如导出为CSV文件) # import csv # with open('river_island_products.csv', 'w', newline='', encoding='utf-8') as csv_file: # writer = csv.DictWriter(csv_file, fieldnames=['商品名称', '商品价格']) # writer.writeheader() # writer.writerows(all_products)
关键知识点解释
find_all()vsfind():find_all()会返回页面上所有匹配条件的元素组成的列表,而find()仅返回第一个匹配元素,这是实现批量爬取的核心。- 按容器遍历:先定位每个商品的外层容器,再在容器内查找名称和价格,能确保每个商品的名称和价格是一一对应的,避免数据错位。
- 异常防护:加入
if name_box and price_box的判断,防止部分商品因无货、下架等原因缺失信息,导致代码中途崩溃。 - 结构化存储:用字典存储单个商品信息,再存入列表,后续导出为CSV、JSON等格式会非常便捷。
对你原有代码的小提醒
你原来的代码里,for item in name_box, price_box:这段逻辑是有问题的——因为name_box和price_box是在循环之后才定义的,而且仅存了第一个商品的元素,所以根本无法实现批量遍历。咱们上面的代码重构了这个逻辑,先拿到所有商品容器再逐个处理,就解决了问题。
内容的提问来源于stack exchange,提问作者ScottCee




