我正在制作一个网络抓取工具,以从某个站点抓取MLB游戏的比分。我基本上是在尝试在输出CSV文件中创建标题行,该文件行包含“团队”,然后是网站上的div类,其中包含游戏中的每个局号,其后是R,H,E。通常,一个可以只是.writerow ['Teams','1','2','3','4','5','6','7','8','9','R',' H','E']进入该行,但是有时游戏会转到额外的局,因此带有局号/ RHE的div类会动态更改,因此我希望刮板程序能够识别并相应地调整行。
我的代码如下:
from bs4 import BeautifulSoup
import requests
import csv
with open('BoxScoreURLS.csv', newline='') as f_urls, open('IndividualBoxScoresOutput.csv', 'w', newline='') as f_output:
csv_urls = csv.reader(f_urls)
csv_output = csv.writer(f_output)
#csv_output.writerow(['Teams', 'Box Scores'])
for line in csv_urls:
page = requests.get(line[0]).text
soup = BeautifulSoup(page, 'html.parser')
topline = soup.findAll('div', {'class' :'LineScoreCard__lineScoreColumnElement--1byQk LineScoreCard__header--3ZO_N'})
for t in range(len(topline)):
csv_output.writerow(['Teams', topline[t].text])
这是我要抓取的网址:(我的代码将从单独的CSV网址列表中读取)
https://www.thescore.com/mlb/events/63853
这是它输出到CSV的内容:
Teams 1
Teams 2
Teams 3
Teams 4
Teams 5
Teams 6
Teams 7
Teams 8
Teams 9
Teams R
Teams H
Teams E
并且当有游戏进行额外的比赛时,它看起来像:
Teams 1
Teams 2
Teams 3
Teams 4
Teams 5
Teams 6
Teams 7
Teams 8
Teams 9
Teams 10
Teams 11
Teams R
Teams H
Teams E
这就是我想看到的:
Teams 1 2 3 4 5 6 7 8 9 R H E
因此该div类的“全部查找”将正确收集信息,但是现在创建的是CSV中的两列。我也尝试了几种不同的row.append组合,但没有成功。一旦获得将div类附加到与“团队”显示所在行相同的解决方案之后,我将在标题行中将分数放在下面。
是否可以通过某种方式循环查找所有div类,然后将其附加为与“ Teams”在同一行中水平出现?让我知道是否可以回答其他问题。
谢谢!
答案 0 :(得分:0)
@SergeBallesta为我提供了一个完美的解决方案。
writerow(['Teams'] + [topline [t]。范围内t的文本(len(topline))])
非常感谢!