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
相关产品推荐
相关产品推荐

