【发布时间】: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