可以使用bs4向<tr>行中添加新的<td>实例吗?

时间:2019-06-25 13:08:25

标签: python html python-3.x beautifulsoup edit

我要编辑一个.htm文件的表,该表大致如下所示:

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

我在Word中制作了一个预格式化的模板,该模板具有格式良好的style =“”属性。我从格式较差的.html文件(这是科学程序的输出)将参数值插入到适当的tds中。我的工作是自动创建html表,以便基本上可以在论文中使用它们。

这很好用,而模板中的tr中有空的td实例。但是,当我尝试在tr(在其上进行迭代)中创建其他tds时,我陷入了困境。这些行的.append和.append_after方法只会覆盖现有的td实例。我需要创建新的tds,因为我想动态创建列数,并且需要迭代多达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,因为该行将具有正确的style =“”。是否可以只复制具有所有格式的bs4.element并将其添加为tr中的最后一个td?如果没有,我应该使用什么模块/方法?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以通过分配给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>