#python #beautifulsoup
Вопрос:
У меня есть объект BS4, подобный этому:
<table border="0" class="dataframe comparison_for_values">
<thead>
<tr style="text-align: center;">
<th>System</th>
<th>Date</th>
<th>value sum 1</th>
<th>value sum 2</th>
<th>value diff</th>
<th>value diff in %</th>
</tr>
</thead>
<tbody>
<tr>
<td>System 1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>System 2</td>
<td>5</td>
<td>-240</td>
<td>-244</td>
<td>4</td>
<td>-1.82</td>
</tr>
<tr>
<td>System 3</td>
<td>10</td>
<td>-261</td>
<td>-245</td>
<td>-16</td>
<td>6.31</td>
</tr>
</tbody>
</table>
Я хочу отформатировать последние 2 td
в каждом tr
, когда значение отличается от 0 (добавив class
атрибут). Я не знаю, как перебирать td
tr
s в s только в теле, не меняя также th
s.
Как это сделать?
Комментарии:
1. Не могли бы вы подробнее остановиться на этом —
how to iterate over td in th in tbody only, I mean avoiding tr lines.
. Я не вижу ничего<td>
внутри<th>
внутри<tbody>
Ответ №1:
Представьте, что ваш прекрасный суповой объект называется soup
. Тогда вы могли бы достичь этого с помощью следующего кода:
from bs4 import BeautifulSoup
trs = soup.find_all("tr")
for tr in trs:
tds = tr.find_all("td")
last_two_start = max(len(tds)-2,0)
for i in range(last_two_start, len(tds)):
if tds[i].get_text() != "0":
tds[i]["class"]= "New_Class"
Когда вы затем посмотрите на soup
via print(soup)
, вы получите результат:
<table border="0" class="dataframe comparison_for_values">
<thead>
<tr style="text-align: center;">
<th>
System
</th>
<th>
Date
</th>
<th>
value sum 1
</th>
<th>
value sum 2
</th>
<th>
value diff
</th>
<th>
value diff in %
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
System 1
</td>
<td>
0
</td>
<td>
0
</td>
<td>
0
</td>
<td>
0
</td>
<td>
0
</td>
</tr>
<tr>
<td>
System 2
</td>
<td>
5
</td>
<td>
-240
</td>
<td>
-244
</td>
<td class="New_Class">
4
</td>
<td class="New_Class">
-1.82
</td>
</tr>
<tr>
<td>
System 3
</td>
<td>
10
</td>
<td>
-261
</td>
<td>
-245
</td>
<td class="New_Class">
-16
</td>
<td class="New_Class">
6.31
</td>
</tr>
</tbody>
</table>