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

时间:2019-03-17 19:18:32

标签: python-3.x beautifulsoup urllib

我正在尝试抓取网站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))

网站上列出的每个节目都在“文章”标签内,因此对于汤.find_all()语句中的每个节目,如果“ data-romaji”(网站上列出的节目名称)与在我的“节目”列表中显示,然后提取“ episode-countdown”字符串,然后按照前面的说明将其切成正好数字,然后打印以确保正确执行了操作。

如果您访问网站,则显示节目的顺序为“ Yakusoku no Neverland”,“ Mob Psycho”,“ Dororo”和“ Jojo”,这是在其中获得情节倒数字符串的顺序如果您运行代码。我想要做的是按照“节目”列表的顺序排列它,这样我就可以得到一个节目列表和一个播出的彼此匹配的情节列表。我想将播出的播出列表添加为当前正在构建的熊猫数据框中的一列,因此使其与“ shows”列不匹配。

我是否可以根据我的“表演”列表的顺序而不是网站上使用的顺序来提取“ episode-countdown”字符串?(如果这样)?

1 个答案:

答案 0 :(得分:0)

这是您要找的吗?

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