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

使用BeautifulSoup爬取AJAX加载表格报AttributeError如何解决

问题原因分析与解决方案

错误原因

  • 核心问题:目标表格通过AJAX动态加载,requests.get()只能获取页面初始静态HTML,此时viewAllSeriesTable表格尚未渲染到页面中,file.find('table', id='viewAllSeriesTable')返回None,对空值调用find_all方法直接触发属性报错。
  • 参数使用错误:BeautifulSoup的find方法指定id属性的标准参数为id="viewAllSeriesTable",错误的参数写法也会导致匹配不到元素返回空值。
  • 逻辑错误:代码中已经通过find_all('td')获取到了所有单元格对象,后续循环中再次对单元格调用find_all('td')属于无效逻辑,td标签内不会嵌套td标签,永远无法拿到目标数据。

可行获取方案

方案1:抓取AJAX接口(效率优先)

打开浏览器开发者工具,切换到「网络」面板,筛选「XHR/ fetch」分类,手动触发表格加载后,找到返回表格数据的后端接口,直接用requests请求该接口即可拿到结构化的JSON数据,无需解析HTML页面。该方案请求速度快,数据处理成本极低。

方案2:动态渲染爬取(兼容性优先)

如果接口有签名、鉴权等反爬机制难以破解,可以使用Selenium、Playwright等工具模拟浏览器运行,等待页面AJAX加载完成后再提取数据,参考代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json

# 初始化浏览器
driver = webdriver.Chrome()
driver.get(URL)

# 等待表格加载完成,最长等待10秒
wait = WebDriverWait(driver, 10)
table = wait.until(EC.presence_of_element_located((By.ID, 'viewAllSeriesTable')))

# 提取所有行数据
rows = table.find_elements(By.TAG_NAME, 'tr')
result = []
for row in rows:
    cells = row.find_elements(By.TAG_NAME, 'td')
    # 过滤空行
    row_data = [cell.text.strip() for cell in cells if cell.text.strip()]
    if row_data:
        result.append(row_data)

# 写入JSON文件
with open("data_file.json", "w", encoding="utf-8") as f:
    json.dump(result, f, ensure_ascii=False, indent=2)

# 关闭浏览器
driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:09:03