是否可以<td> <tr> 使用 bs4 向行添加新实例?



我想编辑一个.htm文件的表,该表看起来像这样:

<table>
 <tr>
  <td>
  parameter A
  </td>
  <td>
  value A
  </td>  
 <tr/>
 <tr>
  <td>
  parameter B
  </td>
  <td>
  value B
  </td>  
 <tr/>
 ...
</table>

我在Word中制作了一个预制的模板,该模板的格式="属性。我从格式不佳的.html文件中插入参数值(这是科学程序的输出(。我的工作是自动创建HTML表,以便可以在纸上使用。

这可以正常工作,而模板在TR中具有空的TD实例。但是,当我尝试在TR中创建其他TD(在我迭代(内时,我就会卡住。行的.append和.append_after方法仅覆盖现有的TD实例。我需要创建新的TD,因为我想动态创建列的数量,并且需要在多达5个未形式的输入.html文件中迭代。

from bs4 import BeautifulSoup
with open('template.htm') as template:
    template = BeautifulSoup(template)
template = template.find('table')
lines_template = template.findAll('tr')
    for line in lines_template:
        newtd = line.findAll('td')[-1]
        newtd['control_string'] = 'this_is_new'
        line.append(newtd)

=>没有新的TDS。最后一个被覆盖。没有创建新的列。

我想连续复制并粘贴最后一个TD,因为它将具有正确的样式="该行。是否可以仅复制所有格式的element element,然后将其添加为TR中的最后一个TD?如果没有,我应该使用什么模块/方法?

预先感谢。

您可以通过分配给attrs

来复制属性
data = '''<table>
 <tr>
  <td style="color:red;">
  parameter A
  </td>
  <td style="color:blue;">
  value A
  </td>
 </tr>
 <tr>
  <td style="color:red;">
  parameter B
  </td>
  <td style="color:blue;">
  value B
  </td>
 </tr>
</table>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'lxml')
for i, tr in enumerate(soup.select('tr'), 1):
    tds = tr.select('td')
    new_td = soup.new_tag('td', attrs=tds[-1].attrs)
    new_td.append('This is data for row {}'.format(i))
    tr.append(new_td)
print(soup.table.prettify())

打印:

<table>
 <tr>
  <td style="color:red;">
   parameter A
  </td>
  <td style="color:blue;">
   value A
  </td>
  <td style="color:blue;">
   This is data for row 1
  </td>
 </tr>
 <tr>
  <td style="color:red;">
   parameter B
  </td>
  <td style="color:blue;">
   value B
  </td>
  <td style="color:blue;">
   This is data for row 2
  </td>
 </tr>
</table>

最新更新