如何使用Python提取HTML表格中类名重复的td内目标数值
问题背景
需要提取HTML表格内文本值为1,00的td数据,该td存在重复class属性,所属表格无class标识、tr标签也无唯一属性,无法直接通过类名定位。
- 目标页面地址:https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/pagamentos-e-parcelamentos/taxa-de-juros-selic#Taxa_de_Juros_Selic
- HTML结构参考:

现有基于requests和BeautifulSoup编写的代码运行后仅返回1999年起的Selic税率数据列表,未定位到目标值。
原有代码
import requests from bs4 import BeautifulSoup as BS sample_website = ('https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/pagamentos-e-parcelamentos/taxa-de-juros-selic#Taxa_de_Juros_Selic') page=requests.get(sample_website) soup = BS(page.content, "html.parser") for row in soup.select('table')[1:]: taxa = soup.select('tr')[5:] valor_especifico = row.find_all('td')[5:] print(valor_especifico)
原有运行输出
C:\Users\Francisco\PycharmProjects\INSS\Scripts\python.exe C:/Users/Francisco/PycharmProjects/INSS/MODULOS/web.py [<td class="xl74" style="text-align: center; "><strong>1999</strong></td>, <td class="xl75" height="19"> <strong>janeiro</strong></td>, <td class="xl80" style="text-align: center; ">391,17</td>, <td class="xl80" style="text-align: center; ">349,88</td>, <td class="xl80" style="text-align: center; ">326,26</td>, <td class="xl80" style="text-align: center; ">302,97</td>, <td class="xl80" style="text-align: center; ">277,88</td>, <td class="xl83" height="19"> <strong>fevereiro</strong></td>, <td class="xl80" style="text-align: center; ">387,54</td>, <td class="xl80" style="text-align: center; ">347,53</td>, <td class="xl80" style="text-align: center; ">324,59</td>, <td class="xl80" style="text-align: center; ">300,84</td>, <td class="xl80" style="text-align: center; ">275,50</td>, <td class="xl83" height="19"> <strong>março</strong></td>, <td class="xl80" style="text-align: center; ">384,94</td>, <td class="xl80" style="text-align: center; ">345,31</td>, <td class="xl80" style="text-align: center; ">322,95</td>, <td class="xl80" style="text-align: center; ">298,64</td>, <td class="xl80" style="text-align: center; ">272,17</td>, <td class="xl83" height="19"> <strong>abril</strong></td>, <td class="xl80" style="text-align: center; ">380,68</td>, <td class="xl80" style="text-align: center; ">343,24</td>, <td class="xl80" style="text-align: center; ">321,29</td>, <td class="xl80" style="text-align: center; ">296,93</td>, <td class="xl80" style="text-align: center; ">269,82</td>, <td class="xl83" height="19"> <strong>maio</strong></td>, <td class="xl80" style="text-align: center; ">376,43</td>, <td class="xl80" style="text-align: center; ">341,23</td>, <td class="xl80" style="text-align: center; ">319,71</td>, <td class="xl80" style="text-align: center; ">295,30</td>, <td class="xl80" style="text-align: center; ">267,80</td>, <td class="xl83" height="19"> <strong>junho</strong></td>, <td class="xl80" style="text-align: center; ">372,39</td>, <td class="xl80" style="text-align: center; ">339,25</td>, <td class="xl80" style="text-align: center; ">318,10</td>, <td class="xl80" style="text-align: center; ">293,70</td>, <td class="xl80" style="text-align: center; ">266,13</td>, <td class="xl83" height="19"> <strong>julho</strong></td>, <td class="xl80" style="text-align: center; ">368,37</td>, <td class="xl80" style="text-align: center; ">337,32</td>, <td class="xl80" style="text-align: center; ">316,50</td>, <td class="xl80" style="text-align: center; ">292,00</td>, <td class="xl80" style="text-align: center; ">264,47</td>, <td class="xl83" height="19"> <strong>agosto</strong></td>, <td class="xl80" style="text-align: center; ">364,53</td>, <td class="xl80" style="text-align: center; ">335,35</td>, <td class="xl80" style="text-align: center; ">314,91</td>, <td class="xl80" style="text-align: center; ">290,52</td>, <td class="xl80" style="text-align: center; ">262,90</td>, <td class="xl83" height="19"> <strong>setembro</strong></td>, <td class="xl80" style="text-align: center; ">361,21</td>, <td class="xl80" style="text-align: center; ">333,45</td>, <td class="xl80" style="text-align: center; ">313,32</td>, <td class="xl80" style="text-align: center; ">288,03</td>, <td class="xl80" style="text-align: center; ">261,41</td>, <td class="xl83" height="19"> <strong>outubro</strong></td>, <td class="xl80" style="text-align: center; ">358,12</td>, <td class="xl80" style="text-align: center; ">331,59</td>, <td class="xl80" style="text-align: center; ">311,65</td>, <td class="xl80" style="text-align: center; ">285,09</td>, <td class="xl80" style="text-align: center; ">260,03</td>, <td class="xl83" height="19"> <strong>novembro</strong></td>, <td class="xl80" style="text-align: center; ">355,24</td>, <td class="xl80" style="text-align: center; ">329,79</td>, <td class="xl80" style="text-align: center; ">308,61</td>, <td class="xl80" style="text-align: center; ">282,46</td>, <td class="xl80" style="text-align: center; ">258,64</td>, <td class="xl83" height="19"> <strong>dezembro</strong></td>, <td class="xl80" style="text-align: center; ">352,46</td>, <td class="xl80" style="text-align: center; ">327,99</td>, <td class="xl80" style="text-align: center; ">305,64</td>, <td class="xl80" style="text-align: center; ">280,06</td>, <td class="xl80" style="text-align: center; ">257,04</td>] Process finished with exit code 0
错误原因
- 选择表格时直接用
[1:]切片跳过了第一个表格,而目标值1,00就在靠前的表格中 - 循环内没有基于当前遍历的表格对象查找子元素,每次都全局搜索tr,选择逻辑完全失效
- 硬编码
[5:]切片取固定位置的td,只能拿到索引靠后的1999年之后的历史税率数据,无法匹配到目标值
修复代码
放弃依赖class、id、固定索引的定位逻辑,直接遍历所有td匹配文本内容即可,不受页面属性缺失、结构小幅变动影响:
import requests from bs4 import BeautifulSoup as BS url = 'https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/pagamentos-e-parcelamentos/taxa-de-juros-selic#Taxa_de_Juros_Selic' page = requests.get(url) page.encoding = 'utf-8' soup = BS(page.text, 'html.parser') target = None # 遍历所有td标签 for td in soup.find_all('td'): # 去除空白、不可见换行/空格后匹配文本 content = td.get_text(strip=True).replace('\xa0', '') if content == '1,00': target = td break if target: print(f"定位成功,目标值:{target.get_text(strip=True)}") # 需要获取同行/同列关联数据时,可通过target向上找父级tr再检索对应td即可 else: print("未找到目标值")
内容的提问来源于stack exchange,提问作者Vitor
相关产品推荐
相关产品推荐

