使用BeautifulSoup对TD/TR进行索引

1 投票
1 回答
744 浏览
提问于 2025-04-17 14:06

HTML代码片段:

<tr>
   <td class="faux_th">Unfinished Carport</td>
   <td>336</td>
   <td>0</td>
   <td>67</td>
</tr>
<tr class="alt">
   <td class="faux_th">Finished Encl Porch</td>
   <td>96</td>
   <td>0</td>
   <td>58</td>
</tr>
<tr>
   <td class="faux_th">Finished Open Porch</td>
   <td>60</td>
   <td>0</td>
   <td>18</td>
</tr>
<tr class="alt">
   <td class="faux_th">Base Area</td>
   <td>996</td>
   <td>996</td>
   <td>996</td>
</tr>
<tr>
   <td class="faux_th">Total</td>
   <td>1488</td> ##this is the value I need each time
   <td>996</td>
   <td>1139</td>
</tr>

使用Python和BS4:

houseArea = bs.find('table', {'id': 'ctl00_cphBody_repeaterBuilding_ctl00_gridBuildingArea'})
houseRows = houseArea.findAll('tr')[3]
houseArea1 = str(houseArea)
houseRows = houseRows.findAll('td')[1]
houseRows = str(houseRows)
houseRows = houseRows.replace('<td>', '')
houseRows = houseRows.replace('</td>', '')

我试过的例子运行得很好。但是,当我使用上面的代码片段,其中包含5个TR标签时,显然就出问题了。我想要做的是从标记为“Total”的TR中提取第二个TD。我尝试了各种方法,但就是找不到处理这个的好办法。有没有办法从后面开始索引?如果可以的话,“Total”这个TR的位置总是最后一个。我的最后一个选择是使用正则表达式来匹配HTML,但即使这样,我也不太确定怎么提取我需要的结果。关于如何解决这个问题的建议会很有帮助。

1 个回答

0

当然可以,使用 [-1] 作为索引就行:

lastRow = houseRows[-1]

负数索引是从列表的总长度中减去的,所以索引 -2 就是倒数第二个元素,依此类推。

撰写回答