Python BeautifulSoup循环爬取多页数据时列表仅保留最后一页结果的问题求助
问题分析
你遇到的问题核心有两个:
- 元素选择器不准确:当前使用的
mainAttributes__09f24__26-vh arrange-unit__09f24__3IxLD arrange-unit-fill__09f24__1v_h4 border-color--default__09f24__1eOdn这个冗长的动态class组合,可能会随页面分页发生变化,导致前几页无法匹配到任何商家元素,只有最后一页能抓取到内容,最终列表只保留最后一页数据。 - 未处理变量未定义异常:当
main.find()失败时,gymname变量未被赋值,直接执行append会引发NameError——只是你运行时可能前几页没触发这个错误,或者错误被隐性忽略了。
修复方案
1. 使用更稳定的元素选择器
放弃依赖易变的长class组合,改用更通用的选择逻辑:直接定位商家名称的<a>标签(这类标签的css-166la90类在分页中更稳定),也可以先定位商家卡片容器再提取名称。
2. 初始化变量避免未定义错误
每次处理单个商家时,先将gymname初始化为None,确保即使抓取失败也能正常添加到列表中,不会中断程序。
3. 简化翻页逻辑(可选)
你的翻页逻辑是正确的,但可以简化流程,不需要额外的params列表,直接在循环中计算start参数即可。
修复后的代码
from bs4 import BeautifulSoup as bs import requests # 初始化存储列表(放在循环外,确保不会被重置) gymname_list = [] # 直接循环4页,计算start参数(对应0,10,20,30) for page_number in range(4): start = page_number * 10 headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'} url = f'https://www.yelp.com.au/search?find_desc=gyms&find_loc=Berlin%2C%20Germany&start={start}' # 请求页面,主动抛出请求错误方便排查 response = requests.get(url, headers=headers) response.raise_for_status() page_soup = bs(response.content, 'lxml') # 使用更稳定的选择器:直接定位所有商家名称的a标签 gym_name_tags = page_soup.find_all("a", {"class": "css-166la90"}) for tag in gym_name_tags: gymname = None try: gymname = tag.text.strip() # 去除文本前后多余空格 print(gymname) except Exception as e: print(f"抓取名称失败: {e}") gymname_list.append(gymname) # 验证最终结果 print(f"\n总共抓取到 {len(gymname_list)} 个健身房名称") print(gymname_list)
额外建议
- 添加请求延时:频繁请求可能触发Yelp的反爬机制,建议在每次请求后添加
time.sleep(2)(需导入time模块),降低请求频率。 - 定期检查页面结构:如果Yelp更新了页面class,可通过浏览器开发者工具(F12)重新定位元素选择器。
- 异常捕获细化:可以针对特定异常(比如
AttributeError)进行捕获,让错误排查更精准。
内容的提问来源于stack exchange,提问作者Muhammad Rehan
相关产品推荐
相关产品推荐

