Выводится только последний элемент
Телеграм бот выводит только последние значение (элемент). При том что в консоль выводит все. Я в таком новенький. Дайте совет: что тут не так?
Код:
import requests
import telebot
import random
from telebot import types
from bs4 import BeautifulSoup as Bs
HEADERS = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}
r = requests.get('https://agroplant.com.ua/uk/szr/gerbitsidy/gerbicidi-dlja-soi/', headers = HEADERS)
bot = telebot.TeleBot('5201776897:AAGtPYxcvHk-i-Lsj8sIxB1a8zt3-BEvbTI')
html = Bs(r.text, 'html.parser')
results = html.find(id="content")
job_elements = results.find_all("div", class_="caption")
for job in job_elements:
name = job.find("div", class_="name")
price= job.find("div", class_="price")
@bot.message_handler(commands=['start'])
def start(message):
bot.send_message(message.chat.id, name.text + price.text)
if __name__ == '__main__':
bot.polling(none_stop=True) ```
Ответы (1 шт):
Автор решения: Namerek
→ Ссылка
# pip install tabulate
from tabulate import tabulate
from bs4 import BeautifulSoup as Soup
import re
# Заменил Ваше обращение к странице на открытие файла html сохраненного на диск.
with open('template.html', 'rb') as html_file:
soup = Soup(html_file.read(), 'html.parser')
results = soup.find(id="content")
job_elements = results.find_all("div", class_="caption")
rows = []
headers = ['Назва', 'Ціна']
for job in job_elements:
name = re.sub(r'\s+', ' ', a.get_text(strip=True), flags=re.S) if (
a := name_tg.find_next('a') if (
name_tg := job.find("div", class_="name")
) else None
) else None
price = price_tb.get_text(strip=True) if (
price_tb := job.find("span", class_="price-normal")
) else None
rows.append(
(
name,
price
)
)
data = tabulate(rows, headers=headers, tablefmt="grid")
if __name__ == '__main__':
print(data)
Вот эту таблицу Вы можете отправить ползователю.
output:
+---------------------+------------+
| Назва | Ціна |
+=====================+============+
| Отаман | 8 270 грн |
+---------------------+------------+
| Раундап МАКС | 8 400 грн |
+---------------------+------------+
| Ураган Форте 500 SL | 13 840 грн |
+---------------------+------------+
| Харнес | 11 500 грн |
+---------------------+------------+
| Альфа Бентазон | 8 810 грн |
+---------------------+------------+
| Альфа Маїс | 780 грн |
+---------------------+------------+
| Багіра Супер | 1 710 грн |
+---------------------+------------+
| Базагран | 3 840 грн |
+---------------------+------------+
| Гліфовіт | 7 720 грн |
+---------------------+------------+
| Грінфорт ІГ 480 | 5 000 грн |
+---------------------+------------+
| Клінік | 7 000 грн |
+---------------------+------------+
| Козак | 1 700 грн |
+---------------------+------------+
| Міура | 3 700 грн |
+---------------------+------------+
| Норвел | 3 390 грн |
+---------------------+------------+
| Норвел Екстра | 2 380 грн |
+---------------------+------------+
| Ореол Максі | 5 150 грн |
+---------------------+------------+
| Отаман Екстра | 11 080 грн |
+---------------------+------------+
| Гербіцид Серп | 2 260 грн |
+---------------------+------------+
| Торнадо 500 | 2 900 грн |
+---------------------+------------+
| Тотал | 4 560 грн |
+---------------------+------------+
| Тотал К | 5 230 грн |
+---------------------+------------+
| Агіл | 4 870 грн |
+---------------------+------------+
| Агрітокс | 2 000 грн |
+---------------------+------------+
| Адвокат | 6 710 грн |
+---------------------+------------+
| Антисапа | 1 600 грн |
+---------------------+------------+
| Антисапа Ліквід | 6 820 грн |
+---------------------+------------+
| Аценит | 9 440 грн |
+---------------------+------------+
| Ацетоган | 8 030 грн |
+---------------------+------------+
| Бернар | 9 090 грн |
+---------------------+------------+
| Вентура | 2 770 грн |
+---------------------+------------+
| Відблок Плюс | 7 020 грн |
+---------------------+------------+
| Вінес | 7 340 грн |
+---------------------+------------+