Kandatsu
@Kandatsu

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

1Answer

まず 'div''a' に直してください。編曲者はいない場合があるので要素の存在確認もしてください。

#作曲者取得
song_composer = soup_a.find('a', itemprop='composer').text
#編曲者取得
song_arranger_elem = soup_a.find('a', itemprop='arranger')
song_arranger = song_arranger_elem.text if song_arranger_elem else None
2Like

Comments

  1. @Kandatsu

    Questioner

    解決しました。ご回答いただきありがとうございました。

Your answer might help someone💌