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

Python网页爬取美元汇率遇NoneType错误,求解决方案

问题分析与解决

你的问题核心是请求头格式错误,加上网站可能对非Colab环境的请求做了反爬限制,导致本地请求到的页面结构和Colab中不一致,找不到目标div元素,才抛出NoneType错误。

具体解决步骤

  • 修正请求头格式:你当前把headers写成了字符串,但requests.get的headers参数要求传入字典,正确写法是将User-Agent作为键,浏览器标识作为值。
  • 增加异常判断:不要直接链式调用.find_all,先检查每一步查找的结果是否存在,避免因元素缺失直接报错。
  • 模拟真实浏览器请求:补充几个常用请求头字段,降低被网站识别为爬虫的概率。

修改后的代码

import requests
from bs4 import BeautifulSoup as bs

def dolar():
    # 修正headers为字典格式,添加更多模拟浏览器的字段
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.9'
    }
    url = 'https://finance.yahoo.com/quote/TRY=X/'
    r = requests.get(url, headers=headers)
    
    # 先检查请求是否成功
    if r.status_code != 200:
        print(f"请求失败,状态码:{r.status_code}")
        return None
    
    soup = bs(r.text, 'html.parser')
    # 分步查找元素,每一步做非空判断
    target_div = soup.find("div", {"class": "container yf-mgkamr"})
    if not target_div:
        print("找不到目标div元素,可能页面结构变化或被反爬")
        # 若排查问题,可取消注释查看返回的页面内容
        # print(r.text)
        return None
    
    span_list = target_div.find_all("span")
    if span_list:
        return span_list[0].text
    else:
        print("div下未找到span元素")
        return None

# 调用测试
print(dolar())

额外提示

如果修改后仍找不到元素,取消代码中print(r.text)的注释,查看返回的页面内容:

  • 若返回人机验证页面(比如Cloudflare验证),说明网站反爬严格,学校项目场景下可尝试更换无需验证的汇率数据源;
  • 若页面结构和Colab中不同,说明网站会根据请求环境返回不同结构,需要重新定位元素选择器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:27:14