Я бы переключился на использование hjson, которое позволяет использовать ключи без кавычек и просто извлекать всю переменную foodNutrient
s и анализировать, а не манипулировать строками снова и снова.
Ваша ошибка:
В настоящее время ваш сбой происходит из-за того, что количество элементов хотя бы в одном из исходных массивов имеет разную длину, и, следовательно, ваше выражение для очистки неуместно. Мы исследуем только первое известное вхождение ...
В первом URL, прежде чем использовать регулярное выражение для очистки, у вас есть:
aifr:"[ -35, -10 ]"
после:
"aifr":"[-35,-10]"
Вво-вторых, вы начинаете с массива другой длины:
aifr:"[ 163, 46, 209, 179, 199, 117, 11, 99, 7, 5, 82 ]"
после замены регулярного выражения вместо:
"aifr":"[ 163, 46, 209, 179, 199, 117, 11, 99, 7, 5, 82 ]"
у вас есть:
"aifr":"[163,"46",209,"179",199,"117",11,"99",7,"5",82]"
то есть недопустимый json. Нет больше ключа с разделителями: пары значений.
Nutshell:
Использовать hjson проще. Или обновите регулярное выражение соответствующим образом для обработки массивов переменной длины.
import requests, re, hjson
urls = ['https://nutritiondata.self.com/facts/nut-and-seed-products/3071/1','https://nutritiondata.self.com/facts/vegetables-and-vegetable-products/2383/2']
p = re.compile(r'foodNutrients = (.*?);')
with requests.Session() as s:
for url in urls:
r = s.get(url)
jsonObj = hjson.loads(p.findall(r.text)[0])
serving_weight = jsonObj['FOODSERVING_WEIGHT_1']
g_per_serv = int(serving_weight.split('(')[-1].split('g')[0])
nutrient_0 = jsonObj['NUTRIENT_0']
conv_v = float(nutrient_0)*g_per_serv/100
print('%s : %s (per 100 grams) | %s (per serving %s' %(nutrient_0, round(float(nutrient_0)), round(float(conv_v)), serving_weight))