В приведенном выше коде html нет интервалов, встроенных в другие, поэтому было бы достаточно перебрать продукты и сохранить их текстовое содержимое в словаре, например:
dic = {}
i = 0
for product in products:
dic[i] = product.getText()
i += 1
print(dic)
Но предположим, что в каждом диапазоне будут встроенные промежутки, тогда вы снова используете метод findAll для элемента, как это:
dic = {}
i = 0
for product in products:
spans = prodcut.findAll("span")
for span in spans:
dic[i] = span.getText()
i += 1
print(dic)