You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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() vs find()find_all()会返回页面上所有匹配条件的元素组成的列表,而find()仅返回第一个匹配元素,这是实现批量爬取的核心。
  • 按容器遍历:先定位每个商品的外层容器,再在容器内查找名称和价格,能确保每个商品的名称和价格是一一对应的,避免数据错位。
  • 异常防护:加入if name_box and price_box的判断,防止部分商品因无货、下架等原因缺失信息,导致代码中途崩溃。
  • 结构化存储:用字典存储单个商品信息,再存入列表,后续导出为CSV、JSON等格式会非常便捷。

对你原有代码的小提醒

你原来的代码里,for item in name_box, price_box:这段逻辑是有问题的——因为name_boxprice_box是在循环之后才定义的,而且仅存了第一个商品的元素,所以根本无法实现批量遍历。咱们上面的代码重构了这个逻辑,先拿到所有商品容器再逐个处理,就解决了问题。

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

火山引擎 最新活动