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

Python爬虫问题:如何获取WAUG网站全部商品名称与对应价格

问题分析与解决方案

首先得说,你遇到的问题核心是选择器逻辑和循环逻辑的双重错误,咱们一步步拆解并修正:

原代码的问题点

  1. 选择器只获取了单个商品:你用#good_{}>的方式,初始count=1,所以names和prices其实只拿到了第一个商品的元素,之后循环里反复输出这个唯一的元素内容,自然会重复45次。
  2. 循环逻辑混乱:名称循环把count加到45后,价格循环的while count <45直接不生效,所以完全没输出价格;而且就算生效,分开循环也会导致名称和价格无法一一对应。
  3. 硬编码count上限(45):如果商品数量变化,这个数字就失效了,不如直接获取所有商品元素再遍历。

修正后的代码思路

正确的做法是先获取所有商品的父容器,再逐个提取每个商品的名称和价格,这样能保证名称和价格一一对应,也不用依赖固定的count数值:

#!/usr/bin/env python3
#_*_coding:utf8_*_
import requests
from bs4 import BeautifulSoup

# 改回你实际要爬取的目标网址
url = requests.get('https://www.waug.com/area/?idx=15')
html = url.text
soup = BeautifulSoup(html, 'html.parser')

# 第一步:获取所有商品项(选择所有id以good_开头的元素,可根据实际页面结构调整)
all_items = soup.select('[id^="good_"]')

# 第二步:遍历每个商品,提取对应的名称和价格
for item in all_items:
    # 注意:这里的选择器要替换成你页面实际的类名/标签结构
    # 从当前商品容器内提取名称
    name_elem = item.select_one('div.class_name > div > div')
    # 从当前商品容器内提取价格
    price_elem = item.select_one('div.class_name > div.class_name')
    
    # 避免元素不存在导致报错,先判断再提取文本
    if name_elem and price_elem:
        name = name_elem.text.strip()  # 清理多余空格和换行
        price = price_elem.text.strip()
        print(f"{name} | {price}")  # 同一行输出名称和价格
    else:
        print("某个商品的名称或价格未找到,跳过")

关键说明

  • [id^="good_"]是CSS选择器语法,意思是选择所有id属性以good_开头的元素,不管商品数量多少,都能一次性获取到所有商品容器。
  • select_one()用来在单个商品容器里找唯一的名称/价格元素,比select()更精准,因为每个商品只有一个名称和价格。
  • 增加strip()是为了去掉文本里多余的空格、换行符,让输出更整洁。
  • 加入元素存在性判断,避免页面结构临时变化导致代码直接崩溃。

如果你的页面里商品的父容器不是用id="good_xxx",而是用统一的类名(比如class="product-item"),那把select('[id^="good_"]')改成select('.product-item')就行,这样适配性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:46:31