Можно ли добавить новый экземпляр <td>в строку <tr>с помощью bs4? - PullRequest
0 голосов
/ 25 июня 2019

Я хочу отредактировать таблицу из файла .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 = "". Я вставляю значения параметров в подходящие tds из плохо отформатированного файла .html (это вывод научной программы). Моя работа заключается в том, чтобы автоматизировать создание HTML-таблиц, чтобы их можно было использовать на бумаге.

Это отлично работает, в то время как шаблон имеет пустые экземпляры td в tr. Но когда я пытаюсь создать дополнительные tds внутри tr (который я повторяю), я застреваю. Методы .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)

=> Нет новых тдс. Последний просто перезаписан. Новый столбец не был создан.

Я хочу скопировать и вставить последний тд в ряд, потому что он будет иметь правильный стиль = "" для этой строки. Можно ли просто скопировать элемент bs4.ele со всем форматированием и добавить его в качестве последнего td в tr? Если нет, какой модуль / подход я должен использовать?

Заранее спасибо.

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете скопировать атрибуты, присвоив 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...