我试图从这里刮MLB每日阵容信息:https://www.rotowire.com/baseball/daily-lineups.php

我try 使用python与requests,BeautifulSoup和pandas.

我的最终目标是最终得到两个panda数据帧.

首先是一个开始投球数据帧:

date game_time pitcher_name team lineup_throws
2024-03-29 1:40 PM ET Spencer Strider ATL R
2024-03-29 1:40 PM ET Zack Wheeler PHI R

第二个是起始击球手数据帧:

date game_time batter_name team pos batting_order lineup_bats
2024-03-29 1:40 PM ET Ronald Acuna ATL RF 1 R
2024-03-29 1:40 PM ET Ozzie Albies ATL 2B 2 S
2024-03-29 1:40 PM ET Austin Riley ATL 3B 3 R
2024-03-29 1:40 PM ET Kyle Schwarber PHI DH 1 L
2024-03-29 1:40 PM ET Trea Turner PHI SS 2 R
2024-03-29 1:40 PM ET Bryce Harper PHI 1B 3 L

这将是所有游戏的一天.

我试着根据我的需要调整这个答案,但似乎不能让它很好地工作:Scraping Web data using BeautifulSoup

任何帮助或指导都是非常感谢的.

下面是我试图适应的链接代码,但似乎无法取得进展:

import pandas as pd
import requests
from bs4 import BeautifulSoup


url = "https://www.rotowire.com/baseball/daily-lineups.php"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

weather = []

for tag in soup.select(".lineup__bottom"):
    header = tag.find_previous(class_="lineup__teams").get_text(
        strip=True, separator=" vs "
    )
    rain = tag.select_one(".lineup__weather-text > b")
    forecast_info = rain.next_sibling.split()
    temp = forecast_info[0]
    wind = forecast_info[2]

    weather.append(
        {"Header": header, "Rain": rain.text.split()[0], "Temp": temp, "Wind": wind}
    )


df = pd.DataFrame(weather)
print(df)

我想要的信息似乎包含在lineup__main,而不是lineup__bottom.

推荐答案

你必须 Select 所有的方框,并 Select 所有你想要的功能.

import pandas as pd
import requests
from bs4 import BeautifulSoup


url = "https://www.rotowire.com/baseball/daily-lineups.php"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

data_pitiching = []
data_batter = []
team_type = ''

for e in soup.select('.lineup__box ul li'):
    if team_type != e.parent.get('class')[-1]:
        order_count = 1
        team_type = e.parent.get('class')[-1]

    if e.get('class') and 'lineup__player-highlight' in e.get('class'):
        data_pitiching.append({
            'date': e.find_previous('main').get('data-gamedate'),
            'game_time': e.find_previous('div', attrs={'class':'lineup__time'}).get_text(strip=True),
            'pitcher_name':e.a.get_text(strip=True),
            'team':e.find_previous('div', attrs={'class':team_type}).next.strip(),
            'lineup_throws':e.span.get_text(strip=True)
        })
    elif e.get('class') and 'lineup__player' in e.get('class'):
        data_batter.append({
            'date': e.find_previous('main').get('data-gamedate'),
            'game_time': e.find_previous('div', attrs={'class':'lineup__time'}).get_text(strip=True),
            'pitcher_name':e.a.get_text(strip=True),
            'team':e.find_previous('div', attrs={'class':team_type}).next.strip(),
            'pos': e.div.get_text(strip=True),
            'batting_order':order_count,
            'lineup_bats':e.span.get_text(strip=True)
        })
        order_count+=1

df_pitching = pd.DataFrame(data_pitiching)
df_batter = pd.DataFrame(data_batter)
date game_time pitcher_name team lineup_throws
0 2024-03-29 1:40 PM ET Freddy Peralta Brewers R
1 2024-03-29 1:40 PM ET Jose Quintana Mets L
..
19 2024-03-29 10:10 PM ET Bobby Miller Dodgers R
date game_time pitcher_name team pos batting_order lineup_bats
0 2024-03-29 1:40 PM ET J. Chourio Brewers RF 1 R
1 2024-03-29 1:40 PM ET W. Contreras Brewers C 2 R
...
178 2024-03-29 10:10 PM ET E. Hernandez Dodgers CF 8 R
179 2024-03-29 10:10 PM ET Gavin Lux Dodgers 2B 9 L

Python相关问答推荐

如何自动抓取以下CSV

Python库:可选地支持numpy类型,而不依赖于numpy

计算组中唯一值的数量

将pandas Dataframe转换为3D numpy矩阵

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

多指标不同顺序串联大Pandas 模型

未知依赖项pin—1阻止conda安装""

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

如何使用OpenGL使球体遵循Python中的八样路径?

交替字符串位置的正则表达式

并行编程:同步进程

Python pint将1/华氏度转换为1/摄氏度°°

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

Python协议不兼容警告

在round函数中使用列值

将字节序列解码为Unicode字符串

在聚合中使用python-polars时如何计算模式

如何在Polars中将列表中的新列添加到现有的数据帧中?

在Django REST框架中定义的URL获得404分

将参数从另一个python脚本中传递给main(argv