使用BS4与Requests-HTML爬取仅首页有效,后续报NoneType错误
解决翻页时的AttributeError问题
1. 定位问题根源
报错的核心是page变量为None,说明你在getnextpage函数中获取分页容器的代码没找到对应元素,导致后续调用page.find触发属性错误。
2. 修正分页元素定位逻辑
先通过网页开发者工具确认分页区域的HTML结构,确保选择器准确:
- 若分页容器是带特定class的
div,替换成正确的选择器,比如用soup.find('div', class_='pagination-container')(需替换为实际class); - 也可直接复制开发者工具中的CSS选择器,用
soup.select_one('复制的CSS选择器')定位,准确率更高。
3. 给函数增加空值容错
修改getnextpage函数,先判断分页容器是否存在,再执行后续操作:
def getnextpage(soup): # 替换为正确的分页容器选择器 page = soup.find('div', class_='pagination') if not page: return None # 无分页区域,说明到最后一页 # 检查下一页按钮是否处于禁用状态 next_disabled = page.find('a', {'class': 'page-number page-number--next page-number--icon disabled'}) if next_disabled: return None # 已到最后一页,无下一页 # 获取下一页链接 next_link = page.find('a', {'class': 'page-number page-number--next page-number--icon'}) if next_link and 'href' in next_link.attrs: return next_link['href'] return None
4. 利用Requests-HTML处理动态加载
如果分页是JS动态渲染的,确保请求时启用JS渲染:
from requests_html import HTMLSession session = HTMLSession() r = session.get(current_url) # 渲染JS,可加sleep参数等待页面加载完成 r.html.render(sleep=2) soup = BeautifulSoup(r.html.html, 'html.parser')
5. 优化主循环逻辑
在爬取循环中判断下一页URL是否有效,同时处理相对URL:
current_url = 'https://www.carswitch.com/你的首页路径' while current_url: # 爬取当前页面数据 session = HTMLSession() r = session.get(current_url) r.html.render(sleep=2) soup = BeautifulSoup(r.html.html, 'html.parser') # 此处添加提取车型、价格等数据的代码 # 获取下一页URL并处理相对路径 current_url = getnextpage(soup) if current_url and not current_url.startswith('http'): current_url = 'https://www.carswitch.com' + current_url
6. 调试技巧
- 在
getnextpage中打印soup.prettify(),查看当前页面的完整HTML,确认分页元素是否存在; - 打印
page的值,若为None,立即调整选择器。
内容的提问来源于stack exchange,提问作者greenbananas2
相关产品推荐
相关产品推荐

