Arrays 美化组、请求、数据帧保存到Excel数组错误

Arrays 美化组、请求、数据帧保存到Excel数组错误,arrays,beautifulsoup,python-requests,openpyxl,pandas.excelwriter,Arrays,Beautifulsoup,Python Requests,Openpyxl,Pandas.excelwriter,我是Python的新手,在学校的一个项目中提供帮助。非常感谢您的帮助。谢谢当它到达2004年和2003年时,我得到了一个错误。它是由结果列表引起的。错误为“ValueError:数组的长度必须相同”。我如何引入修复此问题的代码。分数很重要 import requests import pandas as pd from pandas import ExcelWriter from bs4 import BeautifulSoup #from openpyxl.writer.excel impor

我是Python的新手,在学校的一个项目中提供帮助。非常感谢您的帮助。谢谢当它到达2004年和2003年时,我得到了一个错误。它是由结果列表引起的。错误为“ValueError:数组的长度必须相同”。我如何引入修复此问题的代码。分数很重要

import requests
import pandas as pd
from pandas import ExcelWriter
from bs4 import BeautifulSoup
#from openpyxl.writer.excel import ExcelWriter
import openpyxl
#from openpyxl import load_workbook
import csv

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

i=0
while i <= len(year_id)-1: 
    url = 'https://lehighsports.com/sports/mens-soccer/schedule/' + str(year_id[i])
    lehigh = requests.get(url).text
    soup = BeautifulSoup(lehigh,'lxml')

    date_list = []
    for date in soup.find_all('div',class_="sidearm-schedule-game-opponent-date"):
        date_list.append(date.get_text(strip=True, separator=' '))

    name_list = []
    for name in soup.find_all('div',class_="sidearm-schedule-game-opponent-name"):
        name_list.append(name.get_text(strip=True, separator=' '))

    result_list = []
    for result in soup.find_all('div',class_="sidearm-schedule-game-result"):
        result_list.append(result.get_text(strip=True, separator=' '))

    opp_list = []
    for opp in soup.find_all('div',class_="sidearm-schedule-game-opponent-text"):
        opp_list.append(opp.get_text(strip=True, separator=' '))

    conf_list = []
    for conf in soup.find_all('div',class_="sidearm-schedule-game-conference-conference"):
        conf_list.append(conf.get_text(strip=True))

    dict = {'date':date_list,'opponent':name_list,'result':result_list,'list':opp_list,'conference':conf_list}
    df = pd.DataFrame(dict)

    workbook1 = openpyxl.load_workbook('lehigh.xlsx')
    writer = pd.ExcelWriter('lehigh.xlsx', engine='openpyxl') 
    writer.book = workbook1
    df.to_excel(writer, sheet_name=str(year_id[i]),index=False,startrow=0,startcol=0)
    writer.save()
    writer.close()

    i = i+1
导入请求
作为pd进口熊猫
来自《熊猫》的作者
从bs4导入BeautifulSoup
#从openpyxl.writer.excel导入ExcelWriter
导入openpyxl
#从openpyxl导入加载工作簿
导入csv
年份id=['2019'、'2018'、'2017'、'2016'、'2015'、'2014'、'2013'、'2012'、'2011'、'2010'、'2009'、'2008'、'2007'、'2006'、'2005'、'2004'、'2003']
i=0
而我
代码已更新:

输出:

代码已更新:

输出:

一些事情:

  • 您不需要遍历索引。只需在列表中迭代即可
  • 出现错误的原因是结果列表的长度为23,而其他列表的长度为24。因此,您需要了解如何处理空值,以及如何处理它们是否下降(它们可能并不总是最后一个条目)
  • 我要做的是抓取每一行,然后提取数据,而不是将每一个实体拉入列表。然后,我在站点上获取所有这些行并创建一个表,并创建一个表列表(每年一个表)。处理丢失数据的方法是使用try/except。我还添加了一个小函数(find),它将获取表列表并将它们写入单独的excel表中

    import requests
    import pandas as pd
    from pandas import ExcelWriter
    from bs4 import BeautifulSoup
    #from openpyxl.writer.excel import ExcelWriter
    import openpyxl
    #from openpyxl import load_workbook
    import csv
    
    year_id = ['2019','2018','2017','2016','2015','2014','2013','2012','2011','2010','2009','2008','2007','2006','2005','2004','2003']
    
    
    results = []
    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.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')
    
    有几件事:

  • 您不需要遍历索引。只需在列表中迭代即可
  • 出现错误的原因是结果列表的长度为23,而其他列表的长度为24。因此,您需要了解如何处理空值,以及如何处理它们是否下降(它们可能并不总是最后一个条目)
  • 我要做的是抓取每一行,然后提取数据,而不是将每一个实体拉入列表。然后,我在站点上获取所有这些行并创建一个表,并创建一个表列表(每年一个表)。处理丢失数据的方法是使用try/except。我还添加了一个小函数(find),它将获取表列表并将它们写入单独的excel表中

    import requests
    import pandas as pd
    from pandas import ExcelWriter
    from bs4 import BeautifulSoup
    #from openpyxl.writer.excel import ExcelWriter
    import openpyxl
    #from openpyxl import load_workbook
    import csv
    
    year_id = ['2019','2018','2017','2016','2015','2014','2013','2012','2011','2010','2009','2008','2007','2006','2005','2004','2003']
    
    
    results = []
    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.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列,这样我就知道分数线是从哪一年来的。你的代码真是太棒了——那么干净,那么快。谢谢,我要投票吗?对不起,以前从未这样做过(没人问)。另外,还有一个好处-是否有办法将游戏结果(侧臂计划游戏结果文本斜体)例如W,2-0分为“W”和“2-0”。在“检查”HTML时,无法理解如何分别获取这些内容。谢谢请让我知道如何“向上投票”。我真的很有帮助。您应该开始收取$$!!向上投票。。终于发现这是个复选标记!完成。另外,还有一个好处-是否有办法将游戏结果(侧臂计划游戏结果文本斜体)例如W,2-0分为“W”和“2-0”。当“检查”HTMLheyαԋɱҽαԃєιcαη时,我不知道如何分别获得这些——我讨厌这么说,但我在乔治敦的分数中发现了莱海以2-1输了。在你的代码中,这是一场1-0的胜利。有点不对劲。chitown88代码可以工作,但那个人把它放在不同的标签中——我更喜欢你的标签。我无法找出你的代码有什么问题,因为分数是错的。很抱歉通知你。坦克这是惊人的,甚至更快。你真聪明。非常感谢。这太棒了。当然很高兴。另外,还有一个问题,我怎样才能把年份填入第1列,这样我就知道分数线是从哪一年来的。你的代码真是太棒了——那么干净,那么快。谢谢,我要投票吗?对不起,以前从未这样做过(没人问)。另外,还有一个好处-是否有办法将游戏结果(侧臂计划游戏结果文本斜体)例如W,2-0分为“W”和“2-0”。在“检查”HTML时,无法理解如何分别获取这些内容。谢谢请让我知道如何“向上投票”。我真的很有帮助。您应该开始收取$$!!向上投票。。终于发现这是个复选标记!完成。另外,还有一个好处-是否有办法将游戏结果(侧臂计划游戏结果文本斜体)例如W,2-0分为“W”和“2-0”。当“检查”HTMLheyαԋɱҽαԃєιcαη时,我不知道如何分别获得这些——我讨厌这么说,但我在乔治敦的分数中发现了莱海以2-1输了。在你的代码中,这是一场1-0的胜利。有点不对劲。chitown88代码可以工作,但那个人把它放在不同的标签中——我更喜欢你的标签。我无法找出你的代码有什么问题,因为分数是错的。很抱歉通知你。tankshow我可以在excel的第1列中输入年份吗?只需将其包含在数据框中即可。上面编辑的解决方案。请确保接受此解决方案。已接受此解决方案。谢谢对不起,我很痛苦。我怎样才能把它们全部放在一张纸上,而不是放在它们自己的标签上?此外,如何将分数(例如T,2-0)分为T和2-0。它们位于两个独立的T之间。谢谢你。非常感谢你的帮助,没有痛苦。超级容易修改。我会在一小时内完成,完成后告诉你。你好。所以这段代码将分数分成3列。因此,我不想:try:result=row.find('div',class=“sidearm schedule game result”).text.strip()除了:result=''我想合并这个:result=re.findall(r'([A-Z]),\s+([\d-]+)\s*(*),row。选择一个('.sidearm schedule game result')。获取文本(strip=True,分隔符='')[0]你知道怎么做吗??非常感谢。我怎样才能在excel的第1栏中填写这一年?只需包括