Измените тег nth tr на месте, добавив тег td в bs4 - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь перебрать строки таблицы html и каждый раз добавляю новый тег td для создания второго столбца. Проблема в том, что метод .select('tr:nth-of-type(INDEX))', похоже, не работает так, как я думал, потому что выходные данные не изменены. Существуют ли классы в bs4, которые создают индексируемые контейнеры из htmls в bs4? Есть ли другой модуль, который может это сделать?

Вот выдержка из моей таблицы html с 3 строками:

<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt">
 <tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;height:11.45pt">
  <td style="width:163.55pt;border-top:solid windowtext 1.0pt;
  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;
  mso-border-top-alt:solid windowtext .5pt;mso-border-bottom-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt;height:11.45pt" width="218">
   <p align="center" class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;
  text-align:center;line-height:normal">
    <span style='font-size:10.0pt;
  font-family:"CMU Serif"'>
     Compound
     <o:p>
     </o:p>
    </span>
   </p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;height:11.45pt">
  <td style="width:163.55pt;border:none;padding:0cm 5.4pt 0cm 5.4pt;
  height:11.45pt" width="218">
   <p align="center" class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;
  text-align:center;line-height:normal">
    <span style='font-size:10.0pt;
  font-family:"CMU Serif"'>
     Empirical formula
     <o:p>
     </o:p>
    </span>
   </p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:2;height:11.45pt">
  <td style="width:163.55pt;border:none;padding:0cm 5.4pt 0cm 5.4pt;
  height:11.45pt" width="218">
   <p align="center" class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;
  text-align:center;line-height:normal">
    <span style='font-size:10.0pt;
  font-family:"CMU Serif"'>
     Formula weight / g
    </span>
    <span style='font-size:
  10.0pt;font-family:"Cambria Math",serif;mso-bidi-font-family:"Cambria Math"'>
     ⋅
    </span>
    <span style='font-size:10.0pt;font-family:"CMU Serif"'>
     mol
     <sup>
      -1
      <o:p>
      </o:p>
     </sup>
    </span>
   </p>
  </td>
 </tr>
</table>

А вот мой код:

def template_file_opener(path):

    '''Opens the template.htm and returns it as a bs4 Object'''

    with open(path,'r') as inf:
        soup = BeautifulSoup(inf,features='html.parser')

    return soup



template = template_file_opener('template.htm')


for i,tr in enumerate(template.find_all('tr')):
    for j,td in enumerate(tr.find_all('td')):
        temporary_td = str(td)
        old_text = td.text.strip()
        new_text = str(100000000000000000000000000000000000 + i*1000000000)
        new_td = temporary_td.replace(old_text,new_text)
        template.table.select('tr:nth-of-type({})'.format(i)).append(BeautifulSoup(new_td, 'html.parser'))


res = template.table.prettify()
print(res)

Что я делаю не так?

РЕДАКТИРОВАТЬ: Exprected вывод для одной строки: (добавлен новый тд внутри tr)

<tr style="mso-yfti-irow:1;height:11.45pt">
  <td style="width:163.55pt;border:none;padding:0cm 5.4pt 0cm 5.4pt;
  height:11.45pt" width="218">
   <p align="center" class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;
  text-align:center;line-height:normal">
    <span style='font-size:10.0pt;
  font-family:"CMU Serif"'>
     Empirical formula
     <o:p>
     </o:p>
    </span>
   </p>
  </td>
<td style="width:163.55pt;border:none;padding:0cm 5.4pt 0cm 5.4pt;
  height:11.45pt" width="218">
   <p align="center" class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;
  text-align:center;line-height:normal">
    <span style='font-size:10.0pt;
  font-family:"CMU Serif"'>
     100000000000000000000000000000000000
     <o:p>
     </o:p>
    </span>
   </p>
  </td>
 </tr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...