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

BeautifulSoup二次调用findAll报ResultSet无属性错误解决方法

报错原因

findAll()(BeautifulSoup 4版本推荐使用别名find_all(),二者功能完全一致)是单个标签元素对象的方法,用于在当前标签的子节点中做匹配查找。
你通过page.findAll('td', class_='label')得到的labels是ResultSet类型,本质是一个存储了所有匹配到的<td>标签的Python列表,列表本身没有查找子元素的方法,直接对整个列表调用findAll就会触发你看到的属性错误。

正确提取方法

方法1:遍历结果集逐个提取

这是最贴合你原有代码逻辑的写法,只需要遍历labels里的每一个<td>元素,再对单个元素调用查找方法即可:

from bs4 import BeautifulSoup
import requests # 注意原代码缺少requests模块的导入语句

r = requests.get(url, headers=header)
soup = BeautifulSoup(r.content, 'html.parser')
page = soup.find('div', class_='content')
labels = page.find_all('td', class_='label')

result = []
for td_item in labels:
    # 对单个td元素查找内部的span.txt标签
    txt_node = td_item.find('span', class_='txt')
    if txt_node: # 增加非空判断,避免标签不存在时抛出异常
        result.append(txt_node.text.strip())

print(result)
# 运行输出:['Paper', 'Value']

方法2:CSS选择器一步定位

可以直接用select()方法写CSS选择器,跳过中间存储td列表的步骤,直接拿到所有目标span标签,代码更简洁:

# 直接匹配路径:div.content -> td.label -> span.txt
txt_nodes = page.select('td.label span.txt')
result = [node.text.strip() for node in txt_nodes]

如果你需要区分两类都用了txt类名的数据,只需要在选择器里加上两类数据父级的独有特征即可,比如你给出的示例里两类td标签有不同的附加类名:

  • 第一类(Code对应)的td带w15类,选择器写td.label.w15 span.txt即可单独提取
  • 第二类(Last value对应)的td带destaque类,选择器写td.label.destaque span.txt即可单独提取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:57:05