【问题标题】:Python CSV Writerow append with a for loop?Python CSV Writerow 附加一个 for 循环?
【发布时间】:2018-12-11 08:20:39
【问题描述】:

我正在制作一个网络抓取工具,用于从某个网站抓取 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])

这是我要抓取的 URL:(我的代码将从单独的 CSV 中的 URL 列表中读取)

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”相同的行中水平显示?让我知道我是否可以回答更多问题。

谢谢!

【问题讨论】:

  • writerow([topline[t].txt for t in range(len(topline))]) 呢?
  • 您能否提供示例数据,说明它的正常显示方式以及在加时赛中的其他情况。我无法理解提供的信息。
  • 使用您提供的代码,我们无法重现问题。你能edit这个问题包含必要的信息以允许我们运行它吗?
  • @SergeBallesta 感谢您的建议,但是当我尝试它时,它实际上并没有输出任何东西,但我认为这会奏效!?
  • @hsnsd 当然,我会提出另一个答案,提供更多信息。更正:我将更新我最初的问题以提供信息。

标签: python python-3.x csv beautifulsoup


【解决方案1】:

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

writerow(['Teams'] + [topline[t].text for t in range(len(topline))])

非常感谢!

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 2019-05-15
    • 2019-04-05
    • 1970-01-01
    • 2012-09-26
    • 2021-02-28
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多