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

BeautifulSoup无法定位tr类引发AttributeError问题排查求助

爬取DailyFX经济日历页面时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加载的内容。解决方法:

    1. 打开浏览器开发者工具(F12)→「Network」标签,刷新页面后筛选「XHR/Fetch」请求,查找返回经济数据的API接口,直接调用API获取数据更高效可靠。
    2. 若必须爬取页面,使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:45:32