使用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
相关产品推荐
相关产品推荐

