Webスクレイピングで取得情報を追加するためのコードが分からない
歌ネットから作曲者・編曲者情報を取得したい
例)
Pythonで歌ネットから楽曲情報を取得するコードを知りました。
既存のコードに手を加えて作曲者・編曲者情報も取得したいと考えているのですが、うまくいきません。どのように直したらよいでしょうか。
解決方法を教えて下さい。
発生している問題・エラー
AttributeError Traceback (most recent call last)
<ipython-input-15-8803b910cf13> in <cell line: 22>()
31 song_lyric = soup_a.find('div', itemprop='lyrics').text.replace('\n','')
32 #作曲者取得
---> 33 song_composer = soup_a.find('div', itemprop='composer').text
34 #編曲者取得
35 song_arranger = soup_a.find('div', itemprop='arranger').text
AttributeError: 'NoneType' object has no attribute 'text'
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
import datetime
import time
import re
#取得したデータを格納するデータフレームを作成
songs_df = pd.DataFrame(columns=['song_name','lyrics','composer','arranger','release_date'])
#Uta-Net先頭URL
base_url = 'https://www.uta-net.com'
#歌詞一覧ページURL
url = 'https://www.uta-net.com/artist/12550/'
#歌詞一覧ページのHTML取得
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
links = soup.find_all('td', class_='sp-w-100 pt-0 pt-lg-2')
#歌詞ページより、情報を取得
for link in links:
a = base_url + (link.a.get('href'))
#歌詞ページよりHTMLを取得
response_a = requests.get(a)
soup_a = BeautifulSoup(response_a.text, 'lxml')
#曲名取得
song_name = soup_a.find('h2').text
#歌詞取得
song_lyric = soup_a.find('div', itemprop='lyrics').text.replace('\n','')
#作曲者取得
song_composer = soup_a.find('div', itemprop='composer').text
#編曲者取得
song_arranger = soup_a.find('div', itemprop='arranger').text
#発売日取得
detail = soup_a.find('p', class_='detail').text
match = re.search(r'\d{4}/\d{2}/\d{2}', detail)
release_date = datetime.datetime.strptime(match.group(), '%Y/%m/%d').date()
#取得したデータフレームに追加
temp_df = pd.DataFrame([[song_name],[song_lyric],[song_composer],[song_arranger],[release_date]], index=songs_df.columns).T
songs_df = songs_df.append(temp_df, ignore_index=True)
#1秒待機
time.sleep(1)
#csv出力
songs_df.to_csv('songs_df.csv', mode='w')
自分で試したこと
歌詞ページのソースを見たら、作曲者・編曲者の情報は
p class="ms-2 ms-md-3 detail mb-0"
という場所にあったので、#発売日取得 の部分のように
#作曲者取得
composer = soup_a.find('p', class_='ms-2 ms-md-3 detail mb-0').text
というコードを追加してみたところ、情報は得られましたが、全ての文章を抽出してしまったようで、作曲者の情報だけを抽出することはできませんでした。
0