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
相关产品推荐
相关产品推荐

