在线表格提取报错:'NoneType' object has no attribute 'find_all'求助
解决Flightradar24表格爬取时的'NoneType'属性错误
你遇到的'NoneType' object has no attribute 'find_all'错误,本质是soup.find("table", id='tbl-datatable')返回了None——也就是BeautifulSoup没找到目标表格。核心原因是Flightradar24的反爬机制:直接用requests.get发起请求会被识别为非浏览器访问,返回的页面不含目标表格;或者表格是通过JavaScript动态加载的,静态请求无法获取。
方案1:添加请求头模拟浏览器(优先尝试)
给请求添加浏览器标识,绕过基础反爬限制。修改后的代码如下:
import requests from bs4 import BeautifulSoup import pandas as pd # 模拟Chrome浏览器的请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } url = 'https://www.flightradar24.com/data/aircraft/ja11jc' # 携带请求头发起请求 page = requests.get(url, headers=headers) soup = BeautifulSoup(page.text, 'lxml') # 先判断表格是否存在,避免直接调用方法报错 table1 = soup.find("table", id='tbl-datatable') if not table1: print("未找到目标表格,请检查请求头或页面结构是否变化") else: # 提取表头并去除多余空格 headers = [th.text.strip() for th in table1.find_all('th')] # 提取表格行数据 rows = [] for tr in table1.find_all('tr')[1:]: row = [td.text.strip() for td in tr.find_all('td')] rows.append(row) # 生成DataFrame并导出Excel mydata = pd.DataFrame(rows, columns=headers) print(mydata.head()) mydata.to_excel('flight_data.xlsx', index=False)
代码说明:
- 新增
headers模拟浏览器访问,解决基础反爬问题 - 增加表格存在性判断,避免空对象调用方法报错
- 用列表推导式简化数据提取逻辑,代码更简洁
- 内置Excel导出逻辑,直接生成可用于分析的文件
方案2:处理动态加载表格(方案1无效时使用)
如果目标表格是JavaScript动态渲染的,静态requests无法获取数据,需要用selenium模拟浏览器完整渲染页面:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import pandas as pd # 配置Chrome无头模式(后台运行浏览器) chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') # 初始化浏览器实例 driver = webdriver.Chrome(options=chrome_options) driver.get('https://www.flightradar24.com/data/aircraft/ja11jc') # 等待页面加载完成(可根据网络情况调整时间) driver.implicitly_wait(10) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') table1 = soup.find("table", id='tbl-datatable') if not table1: print("未找到目标表格") else: headers = [th.text.strip() for th in table1.find_all('th')] rows = [] for tr in table1.find_all('tr')[1:]: row = [td.text.strip() for td in tr.find_all('td')] rows.append(row) mydata = pd.DataFrame(rows, columns=headers) print(mydata.head()) mydata.to_excel('flight_data.xlsx', index=False) # 关闭浏览器 driver.quit()
注意事项:
- 需先安装selenium:
pip install selenium - 需下载对应版本的ChromeDriver,并确保其路径被系统识别(或在初始化
webdriver时指定路径)
内容的提问来源于stack exchange,提问作者Karl Zammit
相关产品推荐
相关产品推荐

