Маленький дружелюбный нугде, конечно, вы новичок ie, но если вам удалось извлечь это с BeautifulSoup, у вас наверняка есть возможность выяснить это самостоятельно.
С Тем не менее.
Python идеально подходит для выполнения этих задач без пакета, что позволяет очень легко адаптироваться к тому, что у вас под рукой с точки зрения данных. Создание собственного синтаксического анализатора для любых конкретных нужд * занимает совсем немного времени, особенно если оно основано на тексте. Если у вас нет десятков миллионов строк, пользовательский подход синтаксического анализатора работает, и вы всегда сможете выполнить работу.
сначала ваши данные таким образом, что они просто превращаются в список текстовых строк.
data = """
EpisodeST02432293
Date collected18/02/2019
Time collected03:15
Calcium 2.01 L mmol/L 2.15 - 2.50
EpisodeST02430416
Date collected16/02/2019
Time collected04:00
Calcium 1.97 L mmol/L 2.15 - 2.50
EpisodeST02429201
Date collected15/02/2019
Time collected
Calcium 1.96 L mmol/L 2.15 - 2.50
EpisodeST02424551
Date collected14/02/2019
Time collected00:30
Calcium 1.93 L mmol/L 2.15 - 2.50
EpisodeST02423863
Date collected13/02/2019
Time collected
"""
вот версия, которая выполняет свою работу.
from collections import namedtuple
data = data.splitlines()
DS = namedtuple('DS', 'date time name value')
parsed = list()
idx_date = [i for i, r in enumerate(data) if r.strip().startswith('Date')]
for start, stop in zip(idx_date[:-1], idx_date[1:]):
chunk = data[start:stop]
date = time = name = value = None
for row in chunk:
if not row: continue
row = row.strip()
if row.startswith('Episode'): continue
if row.startswith('Date'):
_, date = row.split()
date = date.replace('collected', '')
elif row.startswith('Time'):
_, time = row.split()
time = time.replace('collected', '')
else:
name, value, *_ = row.split()
parsed.append(DS(date, time, name, value))
print(parsed)
и вывод:
[DS(date='18/02/2019', time='03:15', name='Calcium', value='2.01'),
DS(date='16/02/2019', time='04:00', name='Calcium', value='1.97'),
DS(date='15/02/2019', time='', name='Calcium', value='1.96'),
DS(date='14/02/2019', time='00:30', name='Calcium', value='1.93')]
при таком подходе его также легко поместить в float преобразование в числа, создание строк даты и времени в объектах datetime и т. д. c.