【问题标题】:Python Writerow to CSV (Output into Columns from For Loops)Python Writerrow 到 CSV(从 For 循环输出到列中)
【发布时间】: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


    【解决方案1】:

    下面的代码是一种处理方式。

    示例代码:

    from requests import get
    from csv import reader, writer
    from bs4 import BeautifulSoup
    
    url = 'https://www.thescore.com/mlb/events/date/2018-06-29'
    
    headers = ['Date', 'Away Team', 'Home Team', 'Away Score', 'Home Score', 'Final/Extra Innings']
    
    # open writing file with context manager
    with open('DailyResultsOutput.csv', 'w') as output:
        csv_writer = writer(output)
        response = get(url)
    
        # check if request passed
        # could do more error checking here if you wanted to
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')
            date = soup.find('div', attrs={'class' : 'events__date--1OuzN'}).text
            teams = soup.findAll('span', attrs={'class' : 'EventCard__title--DY0la'})
            scores = soup.findAll('div', attrs={'class' : 'col-xs-2 EventCard__rightColumn--7jlDP'})
            finals = soup.findAll('div', attrs={'class' : 'col-xs-4 col-sm-3 EventCard__rightColumn--7jlDP'})
    
            # pair up teams, scores and finals
            lines = list(zip(teams, scores, finals))
    
            # pair up every two teams
            for away, home in zip(lines[::2], lines[1::2]):
    
                # extract string items
                a_team, a_score, final, h_team, h_score, _ = (x.text for x in away + home)
    
                # reorder and write row
                row = date, a_team, h_team, a_score, h_score, final
                csv_writer.writerow(row)
    

    输出:

    DailyResultsOutput.csv

    Fri June 29,NY Mets,Miami,2,8,Final
    Fri June 29,Houston,Tampa Bay,2,3,Final
    Fri June 29,Chi White Sox,Texas,3,11,Final
    Fri June 29,Colorado,LA Dodgers,3,1,Final
    Fri June 29,Minnesota,Chi Cubs,6,10,Final
    Fri June 29,LA Angels,Baltimore,7,1,Final
    Fri June 29,Boston,NY Yankees,1,8,Final
    

    说明:

    • 打开文件进行写入。
    • 使用requests库从带有GET请求的页面中提取html。
    • 使用BeautifulSoup库解析html标签。
    • 使用csv 库操作项目并写入文件。

    【讨论】:

    • 无法找到更好的解决方案。谢谢你这样做。教了我一个新技能。将关闭此并提供反馈。再次感谢。
    • @MattWilson 没问题,很高兴我能帮上忙 :)
    • 不确定您是否会看到这个,但请在此处查看我的最新问题,因为我希望您能提供意见:stackoverflow.com/questions/54165551/…
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    相关资源
    最近更新 更多