BeautifulSoup, Requests, Dataframe Сохранение в Excel ошибки массива - PullRequest
0 голосов
/ 06 января 2020

Я новичок в Python и помогаю в школьном проекте. Буду признателен за любую оказанную помощь. СПАСИБО. Я получаю сообщение об ошибке, когда он попадает в 2004 и 2003 годы. И это вызвано списком result_list. Ошибка «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

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Код обновлен:

import requests
from bs4 import BeautifulSoup
import pandas as pd
from itertools import zip_longest

d = []
n = []
res = []
op = []
yr = []
with requests.Session() as req:
    for year in range(2003, 2020):
        print(f"Extracting Year# {year}")
        r = req.get(
            f"https://lehighsports.com/sports/mens-soccer/schedule/{year}")
        if r.status_code == 200:
            soup = BeautifulSoup(r.text, 'html.parser')
            for date in soup.findAll("div", {'class': 'sidearm-schedule-game-opponent-date flex-item-1'}):
                d.append(date.get_text(strip=True, separator=" "))
            for name in soup.findAll("div", {'class': 'sidearm-schedule-game-opponent-name'}):
                n.append(name.get_text(strip=True))
            for result in soup.findAll("div", {'class': 'sidearm-schedule-game-result'}):
                result = result.get_text(strip=True)
                res.append(result)
            if len(d) != len(res):
                res.append("None")
            for opp in soup.findAll("div", {'class': 'sidearm-schedule-game-opponent-text'}):
                op.append(opp.get_text(strip=True, separator=' '))
                yr.append(year)


data = []
for items in zip_longest(yr, d, n, res, op):
    data.append(items)

df = pd.DataFrame(data, columns=['Year', 'Date', 'Name', 'Result', 'Opponent']).to_excel(
    'lehigh.xlsx', index=False)

Вывод: регистрация онлайн

1 голос
/ 06 января 2020

Несколько вещей:

  1. Вам не нужно перебирать индекс. Просто выполните итерацию по списку
  2. . Причина, по которой вы получаете ошибку, состоит в том, что список результатов имеет длину 23, а остальные списки имеют длину 24. Поэтому вам нужно выяснить, как обращаться с нулями, и иметь дело с тем, где они падают (они могут не всегда быть последней записью) каждая сущность в список. Затем я беру все эти строки на сайте, создаю таблицу и составляю список таблиц (по 1 таблице на каждый год). Способ, которым вы можете справиться с отсутствующими данными, это использовать try / исключением. Я также добавил небольшую функцию (найдено здесь ), которая берет этот список таблиц и записывает их в отдельные таблицы 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')
    
...