Условие if не выполняется в цикле for при очистке данных с kworb.net - PullRequest
0 голосов
/ 16 июня 2019

Мне нужно собрать данные о странах, где артисты чаще всего транслируются в Spotify.Для этого я использую этот источник , который содержит список из 10.000 художников.

Итак, цель моего кода - создать таблицу с двумя столбцами:

  1. имя исполнителя;
  2. страна, в которой артиста больше всего нет.

Я написал код (см. Ниже), который получает эту информацию с личной страницы каждого художника (вот пример для 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.Я был бы признателен за любую помощь в этом.

1 Ответ

0 голосов
/ 16 июня 2019

Вы сравниваете объект bs4 со строкой. Сначала нужно получить текст из каждого найденного объекта, а затем сравнить со строкой:

заменить:

if "<th>Global</th>" not in soup2.find_all('table')[0].find_all('th'):

с:

# get text options from html
found_options = [item.text for item in soup2.find_all('table')[0].find_all('th')]

if "Global" not in found_options:

Выход:

             Artist Country
0         YNW Melly      US
1  Henrique & Diego      BR
2              LANY      PH
3      Parson James      US
4       ANAVITÃRIA      BR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...