実現したいこと
歌ネット というサイトから歌詞の一部と曲名をスクレイピングして持ってきてでディスコードで歌詞クイズのBOTを作りたい
発生している問題・分からないこと
lyrics_dict というリストが空っぽのまま
エラーメッセージ
error
1[2024-10-13 18:54:27] [ERROR ] discord.client: Ignoring exception in on_message 2Traceback (most recent call last): 3 File "C:\Users\ryo62\anaconda3\Lib\site-packages\discord\client.py", line 449, in _run_event 4 await coro(*args, **kwargs) 5 File "C:/Users/ryo62/OneDrive/デスクトップ/Python/bot.py", line 71, in on_message 6 song_link = random.choice(list(lyrics_dict.keys())) 7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 8 File "C:\Users\ryo62\anaconda3\Lib\random.py", line 373, in choice 9 raise IndexError('Cannot choose from an empty sequence') 10IndexError: Cannot choose from an empty sequence
該当のソースコード
import discord import requests from bs4 import BeautifulSoup import random TOKEN = (書いてます) # 出したいアーティスト urls = ['https://www.uta-net.com/artist/9699/', 'https://www.uta-net.com/artist/18093/', 'https://www.uta-net.com/artist/18526/', ] url = random.choice(urls) response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') song_links = [] lyrics_dict = {} # すべての曲のリンクを取得 for link in soup.find_all('a'): href = link.get('href') if href and '/song/' in href: # 曲へのリンクを確認 song_url = f'https://www.uta-net.com{href}' song_response = requests.get(song_url) song_soup = BeautifulSoup(song_response.text, 'html.parser') # アーティスト名を取得 artist_name = song_soup.find('h3').text# ここは実際のHTML構造に応じて変更 # アーティスト名が条件に合う場合 if artist_name in ["Mrs.GREEN APPLE", "SEKAI NO OWARI","Official髭男dism"]: full_link = f'https://www.uta-net.com{href}' song_links.append(full_link) # 各曲の歌詞を取得 for song_link in song_links: song_response = requests.get(song_link) song_soup = BeautifulSoup(song_response.text, 'html.parser') #lyrics_tag = song_soup.find('span', class_='d-block d-lg-none utaidashi text-truncate').text lyrics_tag = song_soup.find('span', class_='d-block pc-utaidashi').text if lyrics_tag: lyrics = lyrics_tag.get_text(separator="\n") else: lyrics = "歌詞が見つかりませんでした" # 曲のタイトルと歌詞を取得 title_tag = song_soup.find('h2') title = title_tag.text if title_tag else "タイトルが見つかりませんでした。" print(f"曲のタイトル: {title}") print(f"歌詞: {lyrics[:100]}...") lyrics_dict[song_link] = {'lyrics': lyrics, 'title': title} intents = discord.Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'ボット {client.user} がオンラインです!') @client.event async def on_message(message): # 自分のメッセージには反応しない if message.author == client.user: return if message.content == 'クイズ出して': # ランダムにURLを選んで歌詞を取得 #url = random.choice(urls) # 歌詞の一部を表示してクイズにする song_link = random.choice(list(lyrics_dict.keys())) song_data = lyrics_dict[song_link] lines = song_data['lyrics'].split('\n') random_lyrics = random.choice(lines) await message.channel.send (f"この歌詞はどの曲でしょうか?: \n\n \"{random_lyrics}\"") # ユーザーの回答を待つ def check(m): return m.author == message.author and m.channel == message.channel user_answer = await client.wait_for('message', check=check) #user_answer = message.content.strip() #if message.author == client.user: if user_answer.content.lower() == song_data['title'].lower(): # 正誤判定 await message.channel.send("正解です!🎉") else: await message.channel.send(f"残念!正解は「{song_data['title']}」です。") # テスト実行 client.run(TOKEN)
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
タグの名前やクラスの名前が間違っているかもしれないと思い、いろいろ試してみたのですが上手くいかず何しろ今月から勉強を始めたものでHTMLの読みかたもあまりわかりません
補足
特になし
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/10/13 12:09
2024/10/13 12:45