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

使用BeautifulSoup的find_all无法遍历所有元素,仅重复抓取首个元素

问题分析与解决方案

兄弟,你这明显踩了个爬虫新手常犯的小坑!我一眼就瞅出问题所在了——你在循环里用的是soup.find('a', class_='product'),这会每次都从整个HTML文档里抓取第一个符合条件的<a>标签,而不是当前遍历到的那个li.widget条目下的元素!

核心问题拆解

你用for products in soup.find_all('li', class_='widget')遍历了所有商品条目,但在获取每个条目的商品链接时,没有基于当前的products元素去查找,而是直接调用了全局的soup.find(),这就导致每次循环都只会拿到页面里的第一个商品链接,自然重复抓取首个元素了。

修复方案

把全局的soup.find改成基于当前products对象的products.find,这样就会在每个li.widget的范围内查找对应的商品链接了。

修正后的完整代码

from bs4 import BeautifulSoup
import requests

source = requests.get('https://gist.githubusercontent.com/cloudjumper2000/2f2bef395811b8f25cc3a9c8e3834117/raw/54d71f17d7e2169006eb7d8963a0e176f1448efe/nemin_sample.html').text
soup = BeautifulSoup(source, 'lxml')

for products in soup.find_all('li', class_='widget'):
    # 这里改成products.find,基于当前li元素查找内部的a标签
    itemurl = products.find('a', class_='product')
    # 如果要拿到链接地址,可以加.get('href'),比如:
    # item_href = itemurl.get('href')
    # 如果要拿到商品名称,用.text:
    # item_name = itemurl.text.strip()
    print(itemurl)

额外小提示

  • 如果要确保每个条目都能找到对应的a标签,可以加个判断,比如if itemurl:,避免找不到元素时报错。
  • 如果要抓取多个属性(比如商品图、价格),都要基于当前的products元素去查找,比如products.find('img', class_='product-img')这样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:42