如何修复爬虫中‘NoneType’ object has no attribute ‘find’错误?
解决Congress.gov爬虫中get_num_pages函数的NoneType错误
问题背景
使用指定仓库代码爬取117、118届美国国会议员姓名时,调用get_num_pages函数触发'NoneType' object has no attribute 'find'错误,推测页面元素未被正确定位,但浏览器查看源码结构无异常。
错误原因分析
- 反爬拦截:直接用
requests.get请求缺少浏览器标识头(User-Agent),网站返回内容与浏览器渲染版本不一致,导致目标元素无法被解析。 - 链式调用风险:原代码连续调用
.find(),任意一步返回None就会触发属性错误,无容错机制。 - 隐性结构差异:网站可能针对非浏览器请求返回不同HTML结构,爬虫拿到的内容和浏览器所见存在差异。
修复方案
1. 添加请求头模拟浏览器
给requests.get添加User-Agent,规避基础反爬拦截:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(congress_url, headers=headers).text
2. 重构get_num_pages函数,增加容错与分步检查
拆分链式调用,每一步检查元素是否存在,同时通过总结果数计算页数(更可靠):
def get_num_pages(soup, page_size): # 分步查找结果容器 tune_number_div = soup.find("div", {"class": "basic-search-tune-number"}) if not tune_number_div: raise ValueError("未找到结果数容器") pagination_div = tune_number_div.find("div", {"class": "pagination"}) if not pagination_div: raise ValueError("未找到分页容器") results_number_span = pagination_div.find("span", {"class": "results-number"}) if not results_number_span: raise ValueError("未找到结果数文本") # 提取总结果数并计算总页数(向上取整) result_text = results_number_span.text.strip() total_results = int(re.search(r'of (\d+)', result_text).group(1)) return (total_results + page_size - 1) // page_size
3. 调整函数调用逻辑
主代码中调用修改后的函数时传入page_size参数:
num_pages = get_num_pages(soup, page_size) print("Number of result pages: ", num_pages)
额外建议
- 可添加请求重试机制,应对网络波动或临时反爬限制。
- 定期验证目标网站HTML结构,若结构更新需同步调整元素定位逻辑。
内容的提问来源于stack exchange,提问作者Noey
相关产品推荐
相关产品推荐

