【问题标题】:BeautifulSoup, Requests, Dataframe, extracting from <SPAN> and Saving to ExcelBeautifulSoup,请求,数据框,从 <SPAN> 中提取并保存到 Excel
【发布时间】:2020-01-09 03:28:30
【问题描述】:

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')

【问题讨论】:

标签: python-3.x pandas html-table beautifulsoup python-requests


【解决方案1】:

您可以将每个 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')

【讨论】:

  • 这太好了!我希望有一天我能达到你的 Python 编程水平。有什么建议可以让我跟上这样的速度吗?
  • 我通过 datacamp.com 和 dataquest.io 学习(寻找一些类似于 python 的数据科学)。至于网络抓取,我只是通过反复试验了解到这一点
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 2021-07-15
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多