Python爬虫问题:如何获取WAUG网站全部商品名称与对应价格
问题分析与解决方案
首先得说,你遇到的问题核心是选择器逻辑和循环逻辑的双重错误,咱们一步步拆解并修正:
原代码的问题点
- 选择器只获取了单个商品:你用
#good_{}>的方式,初始count=1,所以names和prices其实只拿到了第一个商品的元素,之后循环里反复输出这个唯一的元素内容,自然会重复45次。 - 循环逻辑混乱:名称循环把count加到45后,价格循环的
while count <45直接不生效,所以完全没输出价格;而且就算生效,分开循环也会导致名称和价格无法一一对应。 - 硬编码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
相关产品推荐
相关产品推荐

