使用BeautifulSoup find()函数遇AttributeError问题求助
这个问题我熟!你遇到的AttributeError: 'NoneType' object has no attribute 'find'本质上是链式调用踩了坑——你前面的find("div", class_="parsys mainParsys section")没找到对应的元素,返回了None,接着在None上调用find('h3')自然就触发报错了。下面拆解可能的原因和解决办法:
可能的问题点
页面结构已变更
网站大概率更新了布局,你依赖的parsys mainParsys section这个class名可能被修改、拆分,或者目标div的位置发生了变化。建议先打印page.text的前几百字符,看看实际返回的HTML里有没有这个class的元素;也可以用浏览器开发者工具(F12)重新查看当前页面的结构,定位新的元素选择器。请求未获取到有效页面
先检查page.status_code是否为200:如果是404、503这类状态码,说明URL有误或者网站有反爬机制,需要添加请求头(比如headers={'User-Agent': 'Mozilla/5.0...'}),甚至处理登录、Cookie验证;如果状态码正常但返回的是空白或错误页面,那也会导致BeautifulSoup找不到目标元素。字符串替换的低级错误
你写的page.text.replace('n', '')是把所有字符n都删掉了,这明显是个笔误!应该是替换换行符'\n'吧?这个错误会破坏HTML结构(比如把class名里的n删掉),直接导致元素查找失败。赶紧把这行改成page.text.replace('\n', ''),或者先去掉这一步再测试。
调试小技巧
别直接链式调用find,分步写更容易定位问题:
url = url_stub % (stat_id, starting_year) page = requests.get(url) # 先验证请求状态 print(page.status_code) # 打印部分HTML确认内容是否正确 print(page.text[:500]) html = BeautifulSoup(page.text.replace('\n', ''), 'html.parser') # 分步查找,避免链式调用的坑 target_div = html.find("div", class_="parsys mainParsys section") print(target_div) # 检查是否为None if target_div: stat = target_div.find('h3').text else: print("未找到目标div元素,请检查页面结构或请求内容!")
内容的提问来源于stack exchange,提问作者ktgo

