Stack Overflow на русском Asked by Disney on January 9, 2021
Код:
def get_content(html):
global v
global newsw
global bb
soup = BeautifulSoup(html, 'html.parser')
for x in soup.select('.article-summary .caption'):
newsw = x.get_text(strip=True)
print(newsw)
articles = soup.find_all('div', class_='caption caption-bold')
for a in articles:
bb = link+a.find('a')['href']
print(bb)
yu = soup.find_all('span', class_ = 'info-item timestamp')
for c in yu:
v = c.get_text()
print (v)
@client.command()
async def stopgame(ctx):
cvh = discord.Embed(title = 'Игровые новости!', color = 0x6C12C1)
cvh.add_field(name = 'Новость', value = f'{newsw}')
cvh.add_field(name = 'Дата', value = f'{v}')
cvh.add_field(name = 'Ссылка:', value = f'{bb}')
await ctx.send(embed = cvh)
Вывод:
Консоль выдает сразу несколько элементов, а дискорд – нет.
У вас по коду всегда будет последняя новость показываться, т.к. значения вы складываете в переменные, которые могут только одно значение принимать.
Вообще, не используйте глобальные переменные, это плохой подход и он может вызвать ошибки, что будет сложно отлаживать
С дискордом не работал, но могу подсказать как сделать функцию парсера хорошей:
stopgame
(Есть еще другой вариант, но тут нужна база данных, куда новости будете складывать и значения новостей для stopgame
извлекать из базы, но предлагаю это оставить для другого вопроса.)Пример:
from urllib.parse import urljoin
...
def get_news(url: str) -> list:
rs = requests.get(url)
root = BeautifulSoup(rs.content, 'html.parser')
items = []
for item in root.select('.item.article-summary'):
title = item.select_one('.caption').get_text(strip=True)
url_news = urljoin(rs.url, item.select_one('.caption > a')['href'])
date_str = item.select_one('.info-item.timestamp').get_text(strip=True)
items.append((title, url_news, date_str))
return items
@client.command()
async def stopgame(ctx):
for title, url, date_str in get_news('https://stopgame.ru/news'):
cvh = discord.Embed(title = 'Игровые новости!', color = 0x6C12C1)
cvh.add_field(name = 'Новость', value = title)
cvh.add_field(name = 'Дата', value = date_str)
cvh.add_field(name = 'Ссылка:', value = url)
await ctx.send(embed = cvh)
Correct answer by gil9red on January 9, 2021
потому что в переменных v
, newsw
, bb
находится последний найденный элемент. Лучше их превратить их в список и добавлять туда значения. Лучше не использовать глобальные переменные, и возвращать значения из функции
def get_content(html):
v = []
newsw = []
bb = []
soup = BeautifulSoup(html, 'html.parser')
for x in soup.select('.article-summary .caption'):
newsw.append(x.get_text(strip=True))
articles = soup.find_all('div', class_='caption caption-bold')
for a in articles:
bb.append(ink+a.find('a')['href'])
yu = soup.find_all('span', class_ = 'info-item timestamp')
for c in yu:
v.append(c.get_text())
return v, newsw, bb
Answered by Danis on January 9, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP