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

BeautifulSoup报错:'NoneType'对象无'tr'属性,如何提取指定网页表格?

问题排查与解决

AttributeError: 'NoneType' object has no attribute 'tr' 错误的核心原因是代码找不到目标元素 <div class="mail-table-wrapper">,导致 mail_table_div 为 None,后续调用 .find_all('tr') 时触发报错。具体原因及修复方案如下:

核心原因

  • 网站会拦截无合法请求头的爬虫请求,返回不完整或空的HTML内容
  • 目标表格可能是通过JavaScript动态加载的,而requests仅能获取静态HTML,无法捕获动态渲染的内容

修复步骤

1. 添加请求头模拟浏览器访问

给请求添加合法的User-Agent,避免被网站拦截:

import requests
from bs4 import BeautifulSoup

url = 'https://www.cmegroup.com/market-data/cme-group-benchmark-administration/term-sofr.html'
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'
}
response = requests.get(url, headers=headers)
response.raise_for_status()  # 捕获HTTP请求错误

soup = BeautifulSoup(response.content, 'html.parser')

2. 增加元素存在性检查

在操作元素前先判断是否找到目标节点,避免NoneType错误:

mail_table_div = soup.find('div', class_='mail-table-wrapper')
if mail_table_div:
    tr_elements = mail_table_div.find_all('tr')
    for tr in tr_elements:
        # 格式化输出表格内容,去除多余空白字符
        print(tr.get_text(strip=True, separator='\t'))
else:
    print("未找到表格容器元素")

3. 处理动态加载内容(若静态请求无效)

如果表格是JavaScript动态渲染的,使用Selenium模拟浏览器获取完整渲染后的页面:
首先安装依赖:

pip install selenium

然后运行以下代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# 配置无头浏览器模式
options = Options()
options.add_argument('--headless=new')
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=options)
driver.get('https://www.cmegroup.com/market-data/cme-group-benchmark-administration/term-sofr.html')

# 获取渲染后的页面源码
soup = BeautifulSoup(driver.page_source, 'html.parser')
mail_table_div = soup.find('div', class_='mail-table-wrapper')

if mail_table_div:
    tr_elements = mail_table_div.find_all('tr')
    for tr in tr_elements:
        print(tr.get_text(strip=True, separator='\t'))
else:
    print("未找到表格容器元素")

driver.quit()

4. 确认选择器正确性

通过浏览器开发者工具(F12)检查网页实际HTML结构,确认目标表格的父容器类名是否为mail-table-wrapper,避免因网站更新导致选择器失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:22:35