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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:34:56