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

在线表格提取报错:'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:25:23