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