Парсинг с двух сайтов

Доброго времени суток, уважаемые програмисты.
Пытаюсь сделать бота который будет показывать погоду при нажатии на определенную кнопку, а при нажатии на кнопку анекдот, будет рассказывать анекдот. Но у меня конфликтуют слова text и работает только одна из кнопок, а не две одновременно. В написании ботов и программировании в целом 3-ий день, поэтому попрошу разжевать материал, а если возможно отредактировать код для его работоспособности. Заранее спасибо, уважаемые программисты.

import pyowm
import telebot
import requests
from bs4 import  BeautifulSoup as BS
from telebot import types


#Кнопки


#Кнопки
bot = telebot.TeleBot("") #Токен бота из Bot_Father

#Погода
r = requests.get('https://sinoptik.ua/погода-москва')
bot = telebot.TeleBot("") #Токен бота из Bot_Father
html = BS(r.content, 'html.parser')

for el in html.select('#content'):
    t_min = el.select('.temperature .min')[0].text
    t_max = el.select('.temperature .max')[0].text
    text = el.select('.wDescription .description')[0].text

@bot.message_handler(commands=['weather'])
def main(message):
    bot.send_message(message.chat.id, "Погода на сегодня:\n" +
                     t_min + ', ' + t_max + '\n' + text)
#Погода

#Анекдот
#Анекдот

#Клавиатура Начальная

def main():
    markup = types.ReplyKeyboardMarkup(True)
    key1 = types.KeyboardButton('Погода')
    key3 = types.KeyboardButton("Анекдот")
    markup.add(key1)
    markup.add(key3)
    return markup

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, 'Выбери что тебе нужно)', reply_markup=main())

@bot.message_handler(content_types=['text'])
def cont(message):
    if message.text == 'Погода':
        bot.send_message(message.chat.id, "Погода на сегодня:\n" +
                         t_min + ', ' + t_max + '\n' + text)
    elif message.text == "Анекдот":
            receive = requests.get("http://anekdotme.ru/random")
            page = BS(receive.text, "html.parser")
            find = page.select(".anekdot_text")
            for text in find:
                page = (text.getText().strip())
            bot.send_message(message.chat.id, page)
    else:
        bot.send_message(message.chat.id, 'Я тебя не понимаю', reply_markup=main())


#Клавиатура Начальная
bot.polling(none_stop=True)

Для погоды есть куча API, это проще и надежнее парсинга HTML, который может поменяться в любой момент.

Для анекдотов думаю тоже )
https://www.google.com/search?q=анекдоты+api

это как? :thinking: Что за “слова text”?

Из источника:

import config
import telebot
import requests
from bs4 import BeautifulSoup as BS

r = requests.get('http://sinoptik.ua/погода-шийковка')
html = BS(r.content, 'html.parser')
bot = telebot.TeleBot('Здесь вводите Ваш токен')

А у Вас ArDer что?

P. S.
Бонус :slight_smile:

Так тут и есть то же самое.

Проблема как я понял не с данными, а с самими кнопками бота.

Я об этом:

#Кнопки
- bot = telebot.TeleBot("") #Токен бота из Bot_Father

#Погода
r = requests.get('https://sinoptik.ua/погода-москва')
+ bot = telebot.TeleBot("") #Токен бота из Bot_Father
html = BS(r.content, 'html.parser')

Да, тут бот зачем-то пересоздается, видимо ошибка при копипасте )

Тут кстати странновато, что погода достается один раз при запуске бота.
Он будет перезапускаться каждый день?)

1 лайк

Спасибо всем за ответы. Пока что только начинаю разбираться в этой теме и от этого такие глупые ошибки. Да, текст в основном копипастил с разных ресурсов и пытался настроить его на хорошую работу вместе.
Объясню ошибку. При нажатии на кнопку “Анекдот”, он рассказывает мне анекдот, а когда нажимаю на кнопку “Погода”, он выдаёт ошибку следующего содержания:

2020-11-23 15:24:00,833 (util.py:75 WorkerThread3) ERROR - TeleBot: "UnboundLocalError occurred, args=("local variable 'text' referenced before assignment",)
Traceback (most recent call last):
  File "C:\Users\Админ\PycharmProjects\nastuxa\venv\lib\site-packages\telebot\util.py", line 69, in run
    task(*args, **kwargs)
  File "C:/Users/Админ/PycharmProjects/nastuxa/Bot12.py", line 53, in cont
    t_min + ', ' + t_max + '\n' + text)
UnboundLocalError: local variable 'text' referenced before assignment
"
Traceback (most recent call last):
  File "C:/Users/Админ/PycharmProjects/nastuxa/Bot12.py", line 84, in <module>
    bot.polling(none_stop=True)
  File "C:\Users\Админ\PycharmProjects\nastuxa\venv\lib\site-packages\telebot\__init__.py", line 427, in polling
    self.__threaded_polling(none_stop, interval, timeout)
  File "C:\Users\Админ\PycharmProjects\nastuxa\venv\lib\site-packages\telebot\__init__.py", line 451, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\Админ\PycharmProjects\nastuxa\venv\lib\site-packages\telebot\util.py", line 118, in raise_exceptions
    six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2])
  File "C:\Users\Админ\PycharmProjects\nastuxa\venv\lib\site-packages\six.py", line 703, in reraise
    raise value
  File "C:\Users\Админ\PycharmProjects\nastuxa\venv\lib\site-packages\telebot\util.py", line 69, in run
    task(*args, **kwargs)
  File "C:/Users/Админ/PycharmProjects/nastuxa/Bot12.py", line 53, in cont
    t_min + ', ' + t_max + '\n' + text)
UnboundLocalError: local variable 'text' referenced before assignment

Process finished with exit code 1.

Вот с данной ошибкой не могу побороться

В этом нет ошибки, насколько понимаю. Они не конфликтуют

В этой строке

переменная text (и остальные две) может не существовать если не выполнится ни одна итерация этого цикла:

что видимо и произошло.

Тут, кстати, по идее цикл не нужен, ищется же только один элемент, так что лучше select_one.
Что-то типа этого:

el = html.select_one('#content')
t_min = el.select_one('.temperature .min').text
# и т.д.

Но в любом случае причина видимо в том, что такого элемента (с id="content") нет на странице.
Надо смотреть что в html. http://blog.algoprog.ru/how-to-debug-small-programs/

print(r.content)

Но как я говорил лучше использовать какое-нибудь нормальное API.
например