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

爬取表格数据时遇AttributeError: 'NoneType'无find_all属性问题求解

错误原因与解决方法

错误原因

AttributeError: 'NoneType' object has no attribute 'find_all' 这个错误的核心是:你代码中的table变量值为None,说明soup.find('table', id='wetklitab')没有找到符合条件的表格元素。当你试图对None调用find_all()方法时,就会触发这个报错。

可能的触发因素

  • 网页结构更新:目标网站的HTML结构已修改,原表格的id="wetklitab"被移除或更换了属性值。
  • 请求被拦截:服务器识别出请求来自脚本而非浏览器,返回了反爬验证页面或空内容,导致BeautifulSoup解析不到正确的表格。
  • 解析异常:虽然lxml是常用解析器,但如果页面编码格式特殊,可能导致解析不完整,无法定位到表格。

解决步骤与代码示例

1. 验证请求有效性

先确认请求是否成功拿到目标页面:

page = requests.get(url, headers=headers)
print(page.status_code)  # 正常请求返回200
print(page.text[:500])   # 查看页面开头内容,确认是否是目标网页

2. 添加请求头规避反爬

大多数网站会拦截无浏览器标识的请求,添加User-Agent模拟浏览器访问:

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'
}
page = requests.get(url, headers=headers)

3. 更新表格定位方式

手动打开目标URL,查看页面源码找到表格的真实属性(比如class、新的id或父容器特征),调整定位代码:

# 示例:如果表格现在用class属性定位
table = soup.find('table', class_='wetklitab')

# 若不确定目标表格,可先列出所有表格逐一确认
tables = soup.find_all('table')
for idx, tb in enumerate(tables):
    print(f"表格{idx}内容预览:{tb.text[:200]}")

4. 增加空值判断

在处理表格前先判断是否找到,避免直接调用方法报错:

if table:
    headers = []
    for i in table.find_all('tr'):
        title = i.text.strip()
        headers.append(title)
        print(title)
else:
    print("未找到目标表格,请检查网页结构或定位方式")

完整修改后的代码

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = 'https://www.dwd.de/DE/wetter/wetterundklima_vorort/hessen/offenbach/_node.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'
}

page = requests.get(url, headers=headers)
if page.status_code != 200:
    print(f"请求失败,状态码:{page.status_code}")
    exit()

soup = BeautifulSoup(page.text, 'lxml')

# 根据网页实际结构调整表格定位方式
table = soup.find('table', class_='wetklitab')

# 若不确定目标表格,可取消注释以下代码查看所有表格
# tables = soup.find_all('table')
# for idx, tb in enumerate(tables):
#     print(f"表格{idx}预览:{tb.text[:200]}")

if table:
    headers = []
    for i in table.find_all('tr'):
        title = i.text.strip()
        headers.append(title)
        print(title)
else:
    print("未找到目标表格,请检查网页结构或定位方式")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:01:11