【发布时间】:2018-12-15 14:38:14
【问题描述】:
我想我可以根据我收到的上一个类似问题的答案自己解决这个问题,但我又一次空白。
我正在制作一个 Python 3 网络抓取工具,用于从 The Score 的网站上抓取 MLB 分数。我想要的是将相关信息以与网站上显示的完全相同的布局输出到 CSV。此示例使用的 URL 是:
https://www.thescore.com/mlb/events/date/2018-06-29
...这是我当前的代码(我知道这是不正确的,但我尝试了几种不同的解决方案,但没有一个给我我想要的输出,尝试 row.append 等。我有当前从 CSV 导入的 URL 列表,因为我希望它循环浏览 URL 列表,但这是用作示例的一个链接)
from bs4 import BeautifulSoup
import requests
import csv
from csv import reader, writer
with open('DailyResultsURLS.csv', newline='') as f_urls, open('DailyResultsOutput.csv', 'w', newline='') as f_output:
csv_urls = csv.reader(f_urls)
csv_output = csv.writer(f_output, delimiter=',')
csv_output.writerow(['Date', 'Away Team', 'Home Team', 'Away Score', 'Home Score', 'Final/Extra Innings'])
for line in csv_urls:
page = requests.get(line[0]).text
soup = BeautifulSoup(page, 'html.parser')
date = soup.find('div', {'class' : 'events__date--1OuzN'})
teams = soup.findAll('span', {'class' : 'EventCard__title--DY0la'})
scores = soup.findAll('div', {'class' : 'col-xs-2 EventCard__rightColumn--7jlDP'})
final = soup.findAll('div', {'class' : 'col-xs-4 col-sm-3 EventCard__rightColumn--7jlDP'})
for d in range(len(date)):
csv_output.writerow([[date.text] + [teams[r1].text for r1 in range(len(teams))] + [scores[r2].text for r2 in range(len(scores))] + [final[f3].text for f3 in range(len(final))]])
我还附上了一张我的“所需” DailyResultsOutput.csv 输出文件应该是什么样子的图片。
要提一提的是,在网站上为每场特定比赛显示“决赛”的地方,有时可能会变成“决赛 (13)”之类的内容,或者该游戏进入了多少局,因此代码可以'不只是输入字符串“Final”,它需要从站点中获取值。
如您所见,目前它只包含所有所需信息的一行,但我希望它位于适当的列标题下。再次感谢您的所有帮助。如果我遗漏了什么,请告诉我。
【问题讨论】:
标签: python csv beautifulsoup python-requests