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

Python使用bs4爬取GitHub用户星标数时报AttributeError错误如何解决

错误成因
  • 核心原因是你使用的长层级CSS选择器已经失效:GitHub会定期更新个人主页的DOM结构、类名、节点层级,你写的强依赖页面当时结构的选择器现在已经匹配不到任何元素,导致soup.select_one()返回None,调用None.text就触发了这个报错。
  • 额外还有一个代码笔误:函数内部print(total_stars)打印的是函数自身对象,不是你获取到的星标数值。
  • 隐藏风险:如果请求没有带合法的User-Agent,GitHub会直接拦截爬虫请求,返回的页面结构和正常用户访问的结构完全不同,也会导致元素匹配失败。
修复方案
  • 替换为稳定性更高的选择器:不要用完整层级链,改用页面逻辑特征匹配,比如星标入口的href必然带tab=stars参数,计数数值统一用Counter类,这个特征远比重叠的布局类名稳定。
  • 增加节点存在性判断,避免直接调用text属性触发异常。
  • 增加合法的请求头,避免被GitHub拦截。
  • 修正打印逻辑的笔误。

修复后的参考代码:

import requests
from bs4 import BeautifulSoup

def total_stars(username):
    try:
        # 增加合法UA,避免被GitHub拦截
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
        html = requests.get(f'https://github.com/{username}', headers=headers).text
        soup = BeautifulSoup(html, 'html.parser')
        # 改用稳定的特征选择器
        star_ele = soup.select_one('a[href*="tab=stars"] span.Counter')
        if not star_ele:
            return 0
        # 清除数值前后的空白字符
        star_count = star_ele.text.strip()
        print(star_count)
        # 如果需要返回数字类型,可以加以下转换逻辑处理k/M等单位
        # if 'k' in star_count:
        #     return int(float(star_count.replace('k','')) * 1000)
        # elif 'M' in star_count:
        #     return int(float(star_count.replace('M','')) * 1000000)
        # return int(star_count)
        return star_count
    except:
        return 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:36:05