【问题标题】:Writing and Saving CSV File From Scraping Data从抓取数据中写入和保存 CSV 文件
【发布时间】:2018-09-30 14:46:00
【问题描述】:

在下面的代码中,我成功地抓取了每支 MLB 球队的名单以及他们当天(4 月 18 日)的获胜概率。我想将此数据导出到 CSV 文件,但是当我编写代码时,只有一个团队和获胜概率被导出。有谁知道为什么会这样?我认为需要用 CSV 编写器编写另一个 for 循环,但我不确定如何使用两个单独的抓取数据源(团队名称和获胜概率)来做到这一点提前致谢!

import requests
import csv
from bs4 import BeautifulSoup

page=requests.get('https://www.fangraphs.com/livescoreboard.aspx?date=2018- 
04-18')
soup=BeautifulSoup(page.text, 'html.parser')


[link.decompose() for link in soup.find_all(class_='lineup')]

f=csv.writer(open('Win_Probability.csv','w'))
f.writerow(['Teams','Win_Prob'])

team_name_list=soup.find(class_='RadAjaxPanel')
team_name_list_items=team_name_list.find_all('a')


for team_name in team_name_list_items:
  teams=team_name.contents[0]
  print(teams)

winprob_list=soup.find(class_='RadAjaxPanel')
winprob_list_items=winprob_list.find_all('td',attrs={'style':'border:1px 
solid black;'})

for winprob in winprob_list_items:
  winprobperc=winprob.contents[0]
  print(winprobperc)


f.writerow([teams,winprobperc])

【问题讨论】:

    标签: python csv beautifulsoup


    【解决方案1】:

    我认为您在循环访问 teamswinprobperc 变量时会覆盖它们。

    您可以尝试像这样使用列表推导:

    teams = [team.contents[0] for team in team_name_list_items]
    winprobperc = [prob.contents[0] for prob in winprob_list_items]
    

    这会生成每个列表中所有项目的列表,从元素中正确获取您需要的确切字符串。

    假设这些数组的长度相等,那么您可以将它们作为行写入 csv:

    for i in xrange(len(teams)):
        f.writerow([teams[i], winprobperc[i]])
    

    根据您的情况,在将它们添加为行之前先生成完整的数据表可能会有所帮助。为此,您可以根据一个数组的长度生成一个包含所有行的二维数组:

    data = [[teams[i], winprobperc[i]] for i in xrange(len(teams))]
    f.writerows(data)
    

    【讨论】:

      【解决方案2】:
      f.writerow([teams,winprobperc])
      

      不在循环中。所以这段代码只运行一次,写一个团队和获胜概率。您需要遍历所有团队并为每个团队编写器。

      【讨论】:

        猜你喜欢
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 2017-05-01
        • 1970-01-01
        • 2016-04-22
        • 2020-10-11
        相关资源
        最近更新 更多