Если гарантируется, что все промежутки будут иметь заголовок data-original-title ... и если заголовок всегда будет в формате "Happiness<SPACE><PERCENTAGE><NEW LINE>Sadness<SPACE><PERCENTAGE>"
, тогда вам подойдет следующее.
>>> import itertools
>>> import re
>>> import pandas as pd
>>> import bs4
>>> html = """<span class="text-border tooltips" data-original-title="Happiness 84%
... Sadness 80%
... " data-placement="left" data-toggle="tooltip">More stats</span>,
... <span class="text-border tooltips" data-original-title="Happiness 70%
... Sadness 59%
... " data-placement="left" data-toggle="tooltip">More stats</span>"""
>>> soup = bs4.BeautifulSoup(html, 'lxml')
>>> all_rows = []
>>> for span in soup.find_all('span'):
... title_eles = re.split(' |\n', span['data-original-title'])
... title_eles = list(filter(None, title_eles))
... row = dict(itertools.zip_longest(title_eles[::2], title_eles[1::2], fillvalue=""))
... all_rows.append(row)
...
>>> pd.DataFrame(all_rows)
Happiness Sadness
0 84% 80%
1 70% 59%
Также причина, по которой soup.find_all(class_='data-original-title')
возвращает пустое значение, заключается в том, что data-original-title
является атрибутом в вашем HTML. Это не класс.