переменные почему то is not defined temp timew и так далее
from aiogram import Bot, types, Dispatcher, executor
from bs4 import BeautifulSoup
import requests
bot = Bot(token='')
dp = Dispatcher(bot)
#команда старт
@dp.message_handler(commands=['start'])
async def start(message: types.message):
await bot.send_message(message.chat.id, 'Привет я бот который выдаст тебе самые актуальные новости, а также погоду просто выбери нужное снизу')
#парсер новостей
@dp.message_handler(text='Новости')
async def get_news(message):
url = 'https://news.rambler.ru'
page = requests.get(url)
soup = BeautifulSoup(page.text, "html.parser")
filteredNews = []
allNews = soup.findAll('a', class_='_6bF6i')
for data in allNews:
if data.find('div', class_='_1tnKf') is not None:
filteredNews.append(data.text)
for data in filteredNews:
await message.answer(data)
return filteredNews
#парсер погоды
@dp.message_handler(text='Погода')
async def pogoda(message):
pog = 'https://world-weather.ru/pogoda/russia/inza/'
r = requests.get(pog)
soup = BeautifulSoup(r.text, 'html.parser')
for temp in soup.find_all('div', id = 'weather-now-number'):
temp = temp.text
for obl in soup.find_all('span', id = 'weather-now-icon' ):
obl = obl.text
for timew in soup.find_all('div', class_ = 'weather-now-info'):
timew = timew.text[6:-3]
for dr in soup.find_all('div', id = 'weather-now-description'):
line = dr.text
last_index = 0
itog = []
for i, char in enumerate(line[1:-9]):
if char.istitle() or i == len(line[1:-10]):
itog.append(line[last_index:i + 1])
last_index = i + 1
itog.append(line[-10:-4])
itog.append(line[-4:])
dr = ' '.join(itog[:-5])
send_tg = 'Погода в Инзе:' + '\n' + temp + ' ' + obl + '\n'+ dr + '\n' + 'Данные на: ' + timew
print(send_tg)
@dp.message_handler(text="Новости")
async def news(message: types.message):
await bot.send_message(get_news(message))
@dp.message_handler(text="Погода")
async def pogs(message: types.message):
await bot.send_message(pogoda(message))
if __name__ == '__main__':
executor.start_polling(dp)
Ответы (2 шт):
Автор решения: modeller
→ Ссылка
Потому, что объявлены внутри функции. Нужно ввести
send_tg = 'Погода в Инзе:' + '\n' + temp + ' ' + obl + '\n'+ dr + '\n' + 'Данные на: ' + timew
print(send_tg)
в функцию. Замените это на:
await message.answer(f'Погода в Инзе:\n{temp} {obl}\n{dr}\nДанные на: {timew}')
print - он для консоли, пользователи бота не увидят ответ.
Автор решения: Redume
→ Ссылка
Ошибка была связана с тем что переменные были локальными, их можно было вывести только в тех циклах в которых они были и объявлены.
# парсер погоды
@dp.message_handler(text='Погода')
async def pogoda(message):
pog = 'https://world-weather.ru/pogoda/russia/inza/'
r = requests.get(pog)
soup = BeautifulSoup(r.text, 'html.parser')
temp, obl, timew, dr = str, str, str, str
for temp in soup.find_all('div', id='weather-now-number'):
temp = temp.text
for obl in soup.find_all('span', id='weather-now-icon'):
obl = obl.text
for timew in soup.find_all('div', class_='weather-now-info'):
timew = timew.text[6:-3]
for dr in soup.find_all('div', id='weather-now-description'):
line = dr.text
last_index = 0
itog = []
for i, char in enumerate(line[1:-9]):
if char.istitle() or i == len(line[1:-10]):
itog.append(line[last_index:i + 1])
last_index = i + 1
itog.append(line[-10:-4])
itog.append(line[-4:])
dr = ' '.join(itog[:-5])
print(f'Погода в Инзе: \n{temp} {obl} \n{dr} \nДанные на: {timew}')