BeautifulSoup无法定位tr类引发AttributeError问题排查求助
AttributeError的排查方案 问题描述
使用requests和BeautifulSoup爬取https://www.dailyfx.com/economic-calendar#yesterday页面时,触发以下错误:
Traceback (most recent call last): File "c:\Users\Economic Event Scraper\test.py", line 12, in <module> td = column.find("td", class_="dfx-economicCalendarRow__countryCol jsdfx-economicCalendarRow__countryCol align-top") AttributeError: 'NoneType' object has no attribute 'find'
错误表明column变量为None——即代码无法找到指定class的<tr>元素。
排查步骤
验证请求返回的页面内容
requests默认请求头可能被网站识别为爬虫,导致返回内容与浏览器展示不一致。先添加浏览器UA伪装请求,再将页面内容保存到本地查看:import requests from bs4 import BeautifulSoup URL = "https://www.dailyfx.com/economic-calendar#yesterday" 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' } page = requests.get(URL, headers=headers) # 保存页面到本地 with open('dailyfx_page.html', 'w', encoding='utf-8') as f: f.write(page.text)打开生成的
dailyfx_page.html文件,检查是否包含目标<tbody class="dfx-font-size-4">和<tr>元素。如果页面空白或内容不符,说明网站存在反爬机制或需要动态渲染。核对元素class的准确性
在浏览器中右键目标元素→「检查」,复制完整class属性,确保代码中的class无拼写错误、多余空格或遗漏。注意部分网站会使用带随机字符的动态class,这种情况不能用固定class定位,需换用标签层级、id、文本内容等其他属性。排查是否为动态渲染页面
DailyFX经济日历数据大概率通过JavaScript动态加载,requests仅能获取静态HTML,无法获取JS加载的内容。解决方法:- 打开浏览器开发者工具(F12)→「Network」标签,刷新页面后筛选「XHR/Fetch」请求,查找返回经济数据的API接口,直接调用API获取数据更高效可靠。
- 若必须爬取页面,使用
selenium或playwright模拟浏览器加载,获取渲染后的完整HTML。
逐步调试定位问题节点
不要链式调用find,每一步单独打印结果,确认哪一步开始返回None:soup = BeautifulSoup(page.content, 'html.parser') tbody = soup.find("tbody", class_ = "dfx-font-size-4") print("tbody:", tbody) # 检查tbody是否存在 if tbody: column = tbody.find("tr", class_= "dfx-expandableTable__row dfx-economicCalendarRow__pastEvent") print("column:", column) # 检查column是否存在 if column: td = column.find("td", class_="dfx-economicCalendarRow__countryCol jsdfx-economicCalendarRow__countryCol align-top") print("td:", td) # 后续步骤...这样能精准定位是tbody不存在,还是tr元素不存在,缩小排查范围。
确认页面结构是否变更
网站可能更新了页面布局,导致原标签层级或class失效。重新在浏览器中检查元素,确认当前页面的tbody、tr、td层级结构和属性是否与代码一致。
内容的提问来源于stack exchange,提问作者Vibe Improvement

