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

