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

如何修复爬虫中‘NoneType’ object has no attribute ‘find’错误?

解决Congress.gov爬虫中get_num_pages函数的NoneType错误

问题背景

使用指定仓库代码爬取117、118届美国国会议员姓名时,调用get_num_pages函数触发'NoneType' object has no attribute 'find'错误,推测页面元素未被正确定位,但浏览器查看源码结构无异常。

错误原因分析

  1. 反爬拦截:直接用requests.get请求缺少浏览器标识头(User-Agent),网站返回内容与浏览器渲染版本不一致,导致目标元素无法被解析。
  2. 链式调用风险:原代码连续调用.find(),任意一步返回None就会触发属性错误,无容错机制。
  3. 隐性结构差异:网站可能针对非浏览器请求返回不同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:12:05