Я пытаюсь перебрать строки таблицы 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>