Python CSV Writerow附加了for循环?

时间:2018-07-03 05:51:51

标签: python python-3.x csv beautifulsoup

我正在制作一个网络抓取工具,以从某个站点抓取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”在同一行中水平出现?让我知道是否可以回答其他问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

@SergeBallesta为我提供了一个完美的解决方案。

writerow(['Teams'] + [topline [t]。范围内t的文本(len(topline))])

非常感谢!