Повторите tds в тысячах в объекте BS4

#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>