Python, Beautifulsoup - извлечение строк из тегов на основе элементов в списке - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь очистить сайт https://www.livechart.me/winter-2019/tv, чтобы получить количество эпизодов, которые в настоящее время транслировались для определенных шоу в этом сезоне.Я делаю это, извлекая данные тега «episode-countdown», который дает что-то вроде «EP11:», затем метку времени после него, а затем я разрезаю эту строку, чтобы получить только число (в данном случае «11»), а затем вычитаюна 1, чтобы узнать, сколько эпизодов в данный момент вышло в эфир (поскольку отметка времени показывает, когда EP11 выйдет в эфир).

У меня есть список разных шоу, которые я смотрю в этом сезоне, чтобы отфильтровать то, что я извлекаю.строки отсчета эпизодов вместо того, чтобы извлекать отсчет для каждого показа показа.Большая проблема, с которой я сталкиваюсь, заключается в том, что строки «отсчета эпизодов» находятся не в том порядке, в котором я смотрю список своих шоу.Например, если мой список [show1, show2, show3, show4], я мог бы получить строковый тег «episodes-countdown» в порядке show3, show4, show1, show2, если они перечислены в этом порядке на веб-сайте.

Мой текущий код выглядит следующим образом:

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

def countdown():
    html = Request('https://www.livechart.me/winter-2019/tv', headers={'User-Agent': 'Mozilla/5.0'})
    page = urlopen(html)
    soup = BeautifulSoup(page, 'html.parser')
    shows = ['Jojo no Kimyou na Bouken: Ougon no Kaze', 'Dororo', 'Mob Psycho 100 II', 'Yakusoku no Neverland']
    for tag in soup.find_all('article', attrs={'class': 'anime'}):
        if any(x in tag['data-romaji'] for x in shows):
            rlist = tag.find('div', attrs={'class': 'episode-countdown'}).text
            r2 = rlist[:rlist.index(":")][2:]
            print('{} has aired {} episodes so far'.format(tag['data-romaji'], int(r2)-1))

Каждое шоу, указанное на веб-сайте, находится внутри тега "article", поэтому для каждого шоу в операторе soup.find_all (), если«data-romaji» (название шоу, указанного на веб-сайте) соответствует шоу в моем списке «шоу», затем я извлекаю строку «episode-countdown», а затем нарезаю строку до числа, как описано выше, изатем распечатайте, чтобы убедиться, что я сделал это правильно.

Если вы заходите на веб-сайт, в списке перечислены шоу «Yakusoku no Neverland», «Mob Psycho», «Dororo» и «Jojo»в таком порядке вы получаете строки отсчета эпизодов, если запускаете код.То, что я хочу сделать, это сделать это в порядке моего списка «шоу», чтобы у меня был список передач и список выпусков, которые соответствуют друг другу.Я хочу добавить эфирный список эпизодов в виде столбца в фрейме данных pandas, который я сейчас создаю, поэтому его несоответствие столбцу "показывает" будет проблемой.

Есть ли способ извлечь для меня "Строка episode-countdown ", основанная на порядке моего списка" показов "вместо порядка, используемого на веб-сайте (если это имеет смысл)?

1 Ответ

0 голосов
/ 18 марта 2019

Это то, что вы ищете?

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import pandas as pd


html = Request('https://www.livechart.me/winter-2019/tv', headers={'User-Agent': 'Mozilla/5.0'})
page = urlopen(html)
soup = BeautifulSoup(page, 'html.parser')

shows = ['Jojo no Kimyou na Bouken: Ougon no Kaze', 'Dororo', 'Mob Psycho 100 II', 'Yakusoku no Neverland']
master = []


for show in shows:
    for tag in soup.find_all('article', attrs={'class': 'anime'}):
    show_info = []
    if show in tag['data-romaji']:
        show_info.append(tag['data-romaji'])
        rlist = tag.find('div', attrs={'class': 'episode-countdown'}).text
        r2 = rlist[:rlist.index(":")][2:]
        show_info.append(r2)
        master.append(show_info)


 df=pd.DataFrame(master,columns=['Show','Episodes'])
 df

Вывод:

    Show    Episodes
  0     Jojo no Kimyou na Bouken: Ougon no Kaze     23
  1     Dororo                                      11
  2     Mob Psycho 100 II                           11
  3     Yakusoku no Neverland                       11
...