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

如何使用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结构参考:
    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:]切片跳过了第一个表格,而目标值1,00就在靠前的表格中
  2. 循环内没有基于当前遍历的表格对象查找子元素,每次都全局搜索tr,选择逻辑完全失效
  3. 硬编码[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:33:11