BeautifulSoup, запросы, датафреймы, извлечение из <SPAN>и сохранение в Excel - PullRequest
0 голосов
/ 09 января 2020

Python новичок здесь снова! 2 вопроса: 1) Вместо сохранения на нескольких вкладках (в настоящее время сохраняя каждый год на вкладке с именем года), как я могу сохранить все эти данные на одном листе в Excel, называемом «сводка».
2) ('div' , class _ = "sidearm-schedule-game-result") возвращает формат "W, 1-0". Как можно разделить «W, 1-0» на два столбца, один из которых содержит «W», а следующий - «1-0». Большое спасибо


    import requests
    import pandas as pd
    from pandas import ExcelWriter
    from bs4 import BeautifulSoup
    import openpyxl
    import csv


    year_id = ['2003','2004','2005','2006','2007','2008','2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019']
    lehigh_url = 'https://lehighsports.com/sports/mens-soccer/schedule/' 

    results = []

    with requests.Session() as req:
        for year in range(2003, 2020):
            print(f"Extracting Year# {year}")
            url = req.get(f"{lehigh_url}{year}")
            if url.status_code == 200:
                soup = BeautifulSoup(url.text, 'lxml')
                rows = soup.find_all('div',class_="sidearm-schedule-game-row flex flex-wrap flex-align-center row")

                sheet = pd.DataFrame()
                for row in rows:
                    date = row.find('div',class_="sidearm-schedule-game-opponent-date").text.strip()
                    name = row.find('div',class_="sidearm-schedule-game-opponent-name").text.strip()
                    opp = row.find('div',class_="sidearm-schedule-game-opponent-text").text.strip()
                    conf = row.find('div',class_="sidearm-schedule-game-conference-conference").text.strip()

                    try:
                        result = row.find('div',class_="sidearm-schedule-game-result").text.strip()
                    except:
                        result = ''

                    df = pd.DataFrame([[year,date,name,opp,conf,result]], columns=['year','date','opponent','list','conference','result'])
                    sheet = sheet.append(df,sort=True).reset_index(drop=True)

                results.append(sheet)

    def save_xls(list_dfs, xls_path):
        with ExcelWriter(xls_path) as writer:
            for n, df in enumerate(list_dfs):
                df.to_excel(writer,'%s' %year_id[n],index=False,)
            writer.save()

    save_xls(results,'lehigh.xlsx')

1 Ответ

0 голосов
/ 09 января 2020

Вместо создания списка фреймов данных вы можете добавить каждый sheet в 1 фрейм данных и записать его в файл с pandas. Затем, чтобы разделить на 2 столбца, просто используйте .str.split() и разделите запятую.

import requests
import pandas as pd
from bs4 import BeautifulSoup

year_id = ['2019','2018','2017','2016','2015','2014','2013','2012','2011','2010','2009','2008','2007','2006','2005','2004','2003']


results = pd.DataFrame()
for year in year_id: 
    url = 'https://lehighsports.com/sports/mens-soccer/schedule/' + year
    print (url)
    lehigh = requests.get(url).text
    soup = BeautifulSoup(lehigh,'lxml')

    rows = soup.find_all('div',class_="sidearm-schedule-game-row flex flex-wrap flex-align-center row")

    sheet = pd.DataFrame()
    for row in rows:
        date = row.find('div',class_="sidearm-schedule-game-opponent-date").text.strip()
        name = row.find('div',class_="sidearm-schedule-game-opponent-name").text.strip()
        opp = row.find('div',class_="sidearm-schedule-game-opponent-text").text.strip()
        conf = row.find('div',class_="sidearm-schedule-game-conference-conference").text.strip()

        try:
            result = row.find('div',class_="sidearm-schedule-game-result").text.strip()
        except:
            result = ''

        df = pd.DataFrame([[year,date,name,opp,conf,result]], columns=['year','date','opponent','list','conference','result'])
        sheet = sheet.append(df,sort=True).reset_index(drop=True)

    results = results.append(sheet, sort=True).reset_index(drop=True)


results['result'], results['score'] = results['result'].str.split(',', 1).str
results.to_excel('lehigh.xlsx')
...