Python, Beautifulsoup - 根据列表中的项目从标签中提取字符串

Python, Beautifulsoup - Extracting strings from tags based on items in list

我正在尝试抓取网站 https://www.livechart.me/winter-2019/tv 以获取本季某些节目当前播出的剧集数。我通过提取 "episode-countdown" 标签数据来做到这一点,它给出了类似 "EP11:" 的东西,然后在它后面有一个时间戳,然后我将该字符串切片以只给出数字(在本例中为“11”)然后减 1 得到当前播出的剧集数(因为时间戳是 EP11 播出的时间)。

我有一个本季正在观看的不同节目的列表,以便过滤我提取剧集倒计时字符串的节目,而不是提取每个节目播出的倒计时。我遇到的最大问题是 "episode-countdown" 字符串与我正在观看的节目列表的顺序不同。例如,如果我的列表是 [show1, show2, show3, show4],我可能会按 show3、show4、show1、show2 的顺序获得 "episodes-countdown" 字符串标记(如果它们在网站上按该顺序列出)。

我目前的代码如下:

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"(列出的节目名称在网站上)匹配我的 "shows" 列表中的一个节目,然后我提取 "episode-countdown" 字符串,然后将字符串切成前面解释的数字,然后打印以确保我做的正确。

如果您访问该网站,则列出的顺序是 "Yakusoku no Neverland"、"Mob Psycho"、"Dororo" 和 "Jojo",这是您选择的顺序如果您 运行 代码,请获取剧集倒计时字符串。我想要做的是按照我的 "shows" 列表的顺序排列,这样我就有了一个节目列表和一个播放的剧集列表,它们相互匹配。我想将剧集播出列表添加为我当前正在构建的 pandas 数据框中的一列,因此如果它与 "shows" 列不匹配将是一个问题。

有没有办法根据我的 "shows" 列表的顺序而不是网站上使用的顺序提取 "episode-countdown" 字符串(如果这有意义的话)?

这是您要找的吗?

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