Мне нужно собрать данные о странах, где артисты чаще всего транслируются в Spotify.Для этого я использую этот источник , который содержит список из 10.000 художников.
Итак, цель моего кода - создать таблицу с двумя столбцами:
- имя исполнителя;
- страна, в которой артиста больше всего нет.
Я написал код (см. Ниже), который получает эту информацию с личной страницы каждого художника (вот пример для Drake ).Имя исполнителя берется из заголовка страницы, а код страны - из заголовка столбца таблицы, которому предшествует столбец «Глобальный».Для некоторых художников нет столбца под названием «Глобальный», и я должен учитывать это условие.И вот тут-то и возникают мои проблемы.
Я использую следующее условие if:
if "<th>Global</th>" not in soup2.find_all('table')[0].find_all('th'):
Country = soup2.find_all('table')[0].find_all('th')[4].text
else:
Country = soup2.find_all('table')[0].find_all('th')[5].text
country.append(Country)
Но выполняется только первое условие, когда код извлекает текст из 4-гоколонка.В качестве альтернативы я попытался выполнить обратное условие:
if "<th>Global</th>" in soup2.find_all('table')[0].find_all('th'):
Country = soup2.find_all('table')[0].find_all('th')[5].text
else:
Country = soup2.find_all('table')[0].find_all('th')[4].text
country.append(Country)
Но код по-прежнему извлекает текст из 4-го столбца, даже если я хочу, чтобы он извлек его из 5-го столбца, когда 4-й столбец называется «Глобальный».
Этот воспроизводимый код запускается для подмножества исполнителей, для которых есть столбец с заголовком «Global» (например, LANY ) и для которых его нет (например, Henrique).& Диего ) (от # 391 до # 395 от 16 июня 2019 года):
from time import sleep
from random import randint
from requests import get
from bs4 import BeautifulSoup as bs
import pandas as pd
response1 = get('https://kworb.net/spotify/artists.html', headers = headers)
soup1 = bs(response1.text, 'html.parser')
table = soup1.find_all('table')[0]
rows = table.find_all('tr')[391:396] #selected subset of 10.000 artists
artist = []
country = []
for row in rows:
artist_url = row.find('a')['href']
response2 = get('https://kworb.net/spotify/' + artist_url)
sleep(randint(8,15))
soup2 = bs(response2.text, 'html.parser')
Artist = soup2.find('title').text[:-24]
artist.append(Artist)
if "<th>Global</th>" not in soup2.find_all('table')[0].find_all('th'): #problem suspected in this if-condition
Country = soup2.find_all('table')[0].find_all('th')[4].text
else:
Country = soup2.find_all('table')[0].find_all('th')[5].text
country.append(Country)
df = pd.DataFrame({'Artist': artist,
'Country': country
})
print(df)
В результате я получаю следующее:
Artist Country
0 YNW Melly Global
1 Henrique & Diego BR
2 LANY Global
3 Parson James Global
4 ANAVITÃRIA BR
В то время как фактическоеВыходные данные на 16 июня 2019 года должны быть:
Artist Country
0 YNW Melly US
1 Henrique & Diego BR
2 LANY PH
3 Parson James US
4 ANAVITÃRIA BR
Я подозреваю, что неверное условие if для переменной country
.Я был бы признателен за любую помощь в этом.