如何用Python的BeautifulSoup获取指定位置td元素的文本
问题描述
我有如下HTML代码:
<tr> <td class="a">...</td> <td class="a">...</td> <td class="a"> <p> <sup> Name Name Name </sup> </p> </td> <td class="a">...</td> <td class="a">...</td> <td class="a"> <p> <sup>25.01.1980</sup> </p> </td> <td class="a">...</td> <td class="a">...</td> </tr> <tr>...</tr> <tr>...</tr>
我需要获取每个<tr>下第3个和第5个<td>元素的文本,但以下代码无法正常运行:
from bs4 import BeautifulSoup import index soup = BeautifulSoup(index.index_doc, 'lxml') for i in soup.find_all('tr')[2:]: print(i[2].text, i[4].text)
问题原因与解决方案
错误原因
BeautifulSoup返回的<tr>标签对象(即代码里的i)不能直接通过下标[n]访问子元素,这种写法不符合BeautifulSoup的API规范,会引发错误。
修正后的代码
要获取<tr>下的指定<td>,需要先通过find_all('td')获取当前行所有<td>的列表,再根据下标取值:
from bs4 import BeautifulSoup import index soup = BeautifulSoup(index.index_doc, 'lxml') # 遍历从第3个<tr>开始的所有行(下标从0开始,[2:]对应第3个及以后) for tr in soup.find_all('tr')[2:]: # 获取当前行所有<td>元素 tds = tr.find_all('td') # 确保<td>数量足够,避免索引越界 if len(tds) >= 5: # 第3个<td>对应下标2,第5个对应下标4,用.strip()去除多余空白 third_td_text = tds[2].text.strip() fifth_td_text = tds[4].text.strip() print(third_td_text, fifth_td_text)
补充说明
- 下标从0开始计数,所以第3个
<td>对应tds[2],第5个对应tds[4],这部分原始逻辑是正确的。 - 增加
len(tds) >=5的判断,可以避免某些行<td>数量不足导致的索引越界错误。 - 使用
.strip()可以清除文本前后的换行、空格等空白字符,让输出更整洁。
内容的提问来源于stack exchange,提问作者IgorTheOverlord
相关产品推荐
相关产品推荐

