我正在尝试使用 beautifulsoup 抓取 NHL 比赛的结果,但我无法弄清楚如何获取比赛进行的日期以及按顺序排列的结果。比赛日期位于标签下,结果位于“field-content”类中。目前,我可以找到这两个值并将它们放置在自变量中,但我想保留它们在原始网站中出现的顺序并将数据放置在单个变量中。
import bs4 as bs
import urllib.request
sauce = urllib.request.urlopen("https://www.jatkoaika.com/nhl/ottelut").read()
soup = bs.BeautifulSoup(sauce, features="html.parser")
dates = str(soup.find_all("h3"))
dates = dates.replace("<h3>", "").replace("</h3>", "")
games = str(soup.find_all("span", {"class": "field-content"}))
games = games.replace('<span class="field-content">', "").replace("</span>", "")
可以遍历所有日期标题,并为每个标题查找下一个同级“field-content”跨度,以保持顺序并将数据存储在单个变量中。
以下是修改后的代码:
import bs4 as bs
import urllib.request
sauce = urllib.request.urlopen("https://www.jatkoaika.com/nhl/ottelut").read()
soup = bs.BeautifulSoup(sauce, features="html.parser")
results = []
for date_header in soup.find_all("h3"):
date = date_header.text.strip()
game_result = date_header.find_next_sibling("span", {"class": "field-content"}).text.strip()
results.append((date, game_result))
# 打印结果
for date, result in results:
print(f"{date}: {result}")
解释:
-
迭代日期标题:
我们首先使用
soup.find_all("h3")
找到所有日期标题 (h3 标签)。 -
查找下一个同级:
对于每个日期标题,我们使用
find_next_sibling()
方法查找具有类名“field-content”的下一个同级跨度标签。这确保我们获取与该日期对应的比赛结果。 -
提取文本:
我们使用
.text.strip()
从日期标题和游戏结果跨度中提取文本内容。 -
存储在列表中:
我们将日期和结果存储在一个元组中,然后将该元组附加到
results
列表中。 -
打印结果:
最后,我们遍历
results
列表并打印每个日期和相应的比赛结果。
此代码将按原始网站上显示的顺序为提供日期和比赛结果的列表。
标签:python,web-scraping,beautifulsoup From: 58693944