【问题标题】:Python, Beautifulsoup - Extracting strings from tags based on items in listPython,Beautifulsoup - 根据列表中的项目从标签中提取字符串
【发布时间】:2019-03-17 19:18:32
【问题描述】:

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

网站上列出的每个节目都在“文章”标签内,因此对于 soup.find_all() 语句中的每个节目,如果“data-romaji”(网站上列出的节目名称)与在我的“节目”列表中显示,然后我提取“episode-countdown”字符串,然后将字符串切成前面解释的数字,然后打印以确保我做得正确。

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

我有没有办法根据我的“节目”列表的顺序而不是网站上使用的顺序来提取“episode-countdown”字符串(如果有道理的话)?

【问题讨论】:

  • 你能创建一个有序的字典吗? stackoverflow.com/a/12031752/6241235
  • 谢谢,这解决了我的问题。我创建了一个有序字典,然后根据节目列表对其进行排序,然后将有序字典中的值(剧集数)转换为现在与我的节目列表匹配的列表。

标签: python-3.x beautifulsoup urllib


【解决方案1】:

这就是你要找的吗?

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

【讨论】:

  • 这实际上对我来说非常有效。我试图弄清楚如何像你一样编写双循环,但无法让它工作,所以我放弃了。这效果更好,因为它比我目前拥有的代码更短,并将其直接转换为列表,而不是将有序 dict 转换为列表。
猜你喜欢
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
相关资源
最近更新 更多