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

BeautifulSoup索引Tag对象报错,如何提取指定td内容?

解决BeautifulSoup提取<td>时的KeyError: 2问题

错误原因分析

你遇到的KeyError: 2是因为对BeautifulSoup的Tag对象使用索引的逻辑搞错了:

  • 当你执行tr = soup.find_all('tr', class_='even')[1]后,这个tr是一个BeautifulSoup的Tag对象。
  • Tag对象的[]操作是用来访问标签的属性的(比如tr['class']会返回['even']),而不是按索引获取它的子元素。你写的tr[2]是在尝试获取tr标签中名为2的属性,显然这个属性不存在,所以抛出了KeyError。

正确的解决方法

要获取tr下的<td>子元素,你需要先提取所有的<td>标签,再按索引访问:

方法1:使用find_all('td')获取所有td子元素

from bs4 import BeautifulSoup

# 假设你的HTML内容已加载到soup对象中
tr = soup.find_all('tr', class_='even')[1]
# 获取当前tr下的所有td标签,返回列表格式
td_list = tr.find_all('td')

# 第二个td(对应文本"Plupp",注意列表索引从0开始)
second_td_text = td_list[1].get_text(strip=True)
# 第三个td(对应文本"RIFLEMAN")
third_td_text = td_list[2].get_text(strip=True)

print(f"第二个td内容:{second_td_text}")
print(f"第三个td内容:{third_td_text}")

方法2:使用CSS选择器select()

如果你习惯CSS选择器语法,也可以直接定位指定位置的td:

tr = soup.find_all('tr', class_='even')[1]
# 用nth-of-type直接选取第2/3个td(该选择器从1开始计数)
second_td = tr.select('td:nth-of-type(2)')[0]
third_td = tr.select('td:nth-of-type(3)')[0]

print(second_td.get_text(strip=True))
print(third_td.get_text(strip=True))

额外提示

  • get_text(strip=True)可以自动去除文本前后的空白字符(比如换行、空格),让提取结果更整洁。
  • 注意区分两种索引逻辑:find_all()返回的列表是0索引,而CSS选择器的nth-of-type是从1开始计数的,别搞混了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:19