是否可以使用 bs4 将新的 <td> 实例添加到 <tr> 行?
Is it possible to add a new <td> instance to a <tr> row with bs4?
我想编辑一个 table 的 .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 文件(这是科学程序的输出)插入到 appropreatte tds 中。我的工作是自动创建 html table 以便它们基本上可以用在论文中。
这工作正常,而模板在 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?如果不是,我应该使用什么module/approach?
提前致谢。
您可以通过分配给 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>
我想编辑一个 table 的 .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 文件(这是科学程序的输出)插入到 appropreatte tds 中。我的工作是自动创建 html table 以便它们基本上可以用在论文中。
这工作正常,而模板在 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?如果不是,我应该使用什么module/approach?
提前致谢。
您可以通过分配给 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>