Ошибка IndexError: list index out of range в парсере. Помогите мучаюсь уже 3 час
Вот код:
import requests
import fake_useragent
import telebot
from bs4 import BeautifulSoup
KEY = '6470584623:AAHi9QboGdh4KDpM1ZQaDbXXn_f_Q9ZXrBw'
bot = telebot.TeleBot(KEY)
user = fake_useragent.UserAgent().random
header = {'user-agent': user}
url = 'https://meteoinfo.ru/forecasts'
response = requests.get(url, headers=header).text
soup = BeautifulSoup(response, 'lxml')
temp = soup.find_all('td', class_='td_short_gr')[17]
temp_day = temp.text
day = soup.find_all('tr', class_='ftd_short_gr')[3]
day_weather = day.text
@bot.message_handler(commands=['start'])
def hello(message):
bot.send_message(message.chat.id, 'Что бы узнать погоду в Краснодаре пропишите "/pogoda"')
@bot.message_handler(commands=['pogoda'])
def weather(message):
bot.send_message(message.chat.id, f'Завтра в краснодаре {temp_day}, а также {day_weather}')
bot.polling(none_stop=True)
Помогите что делать ошибка:
Traceback (most recent call last): File "C:\Users\artem\PycharmProjects\ConvertorBot\main.py", line 19, in day = soup.find_all('tr', class_='ftd_short_gr')[3] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^ IndexError: list index out of range
я пытаюсь узнать погоду на сайте но там много одинаковых тегов, я где то нашёл что можно при помощи [1] выбирать нужный тег. И суть в том что через время у меня получается но потом снова ошибка
введите сюда код
Ответы (2 шт):
Скорее всего, BeautifulSoup
не смог найти хотя бы 4 элемента на странице, которые бы подходили под паттерн <tr class="ftd_short_gr">
. И, соответственно, при попытке получить элемент с индексом 3 из результатов поиска в супе, бросается IndexError
.
Если бы вы вывели в консоль возвращаемое значение функции soup.find_all('tr', class_='ftd_short_gr')
, Вам самим было бы куда проще разобраться в том, что повлекло за собой бросок исключения.
Судя по всему массив который возвращает функция soup.find_all('tr', class_='ftd_short_gr') не имеет 3 элемента, у этого массива элементов меньше 4. Проверьте правильно ли написан ваш код и на всякий случай напомню что исчисление в массиве начинается с 0