TransWikia.com

Как вывести все элементы парсинга с сайта discord.py?

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)

Вывод:

Выводится 1 элемент, хотя их там несколько.

Консоль выдает сразу несколько элементов, а дискорд – нет.

2 Answers

У вас по коду всегда будет последняя новость показываться, т.к. значения вы складываете в переменные, которые могут только одно значение принимать.

Вообще, не используйте глобальные переменные, это плохой подход и он может вызвать ошибки, что будет сложно отлаживать

С дискордом не работал, но могу подсказать как сделать функцию парсера хорошей:

  • Данные собирайте в список
  • Список возвращайте из функции
  • Функцию вызывайте в 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP