Ошибка при парсинге IndexError: list index out of range
Пишу парсер, выдает ошибку IndexError: list index out of range на line 20. Хочу добиться вывода похожий на [{'title': 'Энергоуголь XXI', 'city': 'Сарань', 'price': '12,24'}]
from bs4 import BeautifulSoup
import requests
URL = 'https://bankchart.kz/spravochniki/indikatory_rynka/electric_tariff/116487'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.487'}
def get_html(url, params = None):
r = requests.get(url, headers = HEADERS, params = params)
return r
def get_content(html):
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('div', class_='row')
provider = []
for item in items:
provider.append({
'title' : item.find('div', class_='col col-currency').get_text(strip = True),
'city' : item.find('div', class_="col col-currency-rate").get_text(strip = True),
'price' : item.find_all('div', class_='col-currency-rate')[4].find_all('p')[0].text,
})
print(provider)
print(len(provider))
def parse():
html = get_html(URL)
if html.status_code == 200:
get_content(html.text)
else:
print("Error")
parse()
Ответы (1 шт):
Автор решения: Jack_oS
→ Ссылка
Ваш код периодически натыкается на заголовки таблиц, не может извлечь данные по индексу и крашиться на этом тут:
'price': item.find_all('div', class_='col-currency-rate')[4].find_all('p')[0].text
Самое простое, хотя и не самое эффективное, решение - "завернуть" проблемную часть в try/except:
for item in items:
try:
provider.append({
'title': item.find('div', class_='col col-currency').get_text(strip=True),
'city': item.find('div', class_="col col-currency-rate").get_text(strip=True),
'price': item.find_all('div', class_='col-currency-rate')[4].find_all('p')[0].text,
})
except:
print('header finded')
Результат:
>>> parse()
header finded
header finded
header finded
[{'title': 'Энергоуголь XXI', 'city': 'Сарань', 'price': '12,24'}, {'title': 'Энергоуголь XXI', 'city': 'Сарань', 'price': '16,30'}, {'title': 'Энергоуголь XXI', 'city': 'Сарань', 'price': '20,37'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '10,15'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '15,69'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '13,46'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '19,67'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '16,83'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '24,57'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '10,19'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '15,69'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '13,46'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '19,67'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '24,57'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '16,83'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '10,15'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '13,46'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '16,83'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '10,19'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '13,46'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '16,83'}, {'title': 'Энергоуголь XXI', 'city': 'Сарань', 'price': '13,58'}, {'title': 'ҚарағандыЖылуСбыт', 'city': 'Карагандинская область', 'price': '11,22'}, {'title': 'Расчетный сервисный центр', 'city': 'Карагандинская область', 'price': '16,39'}]
24