如何使用Beautiful Soup(模式容器)抓取HTML数据端点

时间:2019-09-15 22:54:54

标签: python html web-scraping beautifulsoup

我目前正在尝试从棒球参考中抓取数据,并且一切进行得很好,除了我遇到了尝试在模式容器/数据端点内抓取数据的问题。现在,我实际上并不了解HTML,尽管我很熟悉,足以轻松地进行抓取-这就是为什么我不确定是否应该将要输入的内容分类为数据端点或模态容器。希望可以在下面阐明它:

如果您转到https://www.baseball-reference.com/players/gl.fcgi?id=torregl01&t=b&year=2019,这是我要从中抓取的示例页面,并查看标有“ PA”的列,您会看到单击该值会加载一个弹出窗口。我正在尝试从该窗口抓取信息,这正是导致我出现问题的原因-我根本不知道如何抓取不在网页上直接显示的信息。

以下是通过“检查”为容器找到的html: HTML

我还发现每一行中的“ PA”单元格在其属性中列出了一个数据端点,如下所示: Cell data-endpoint

我不确定如何在弹出窗口中访问信息,如果可能的话,我更愿意使用Beautiful Soup进行操作。如果有人至少可以将我指向正确的方向,以便从这些类型的弹出窗口中抓取信息,那将非常有帮助。

衷心感谢任何能帮助我的人-将不胜感激!

1 个答案:

答案 0 :(得分:1)

我的解决方案仅使用请求和精美的汤(和熊猫来显示解决方案)。编辑:这段代码之前有粗心的错误。以下内容应使用任何玩家的网址并获取所有弹出窗口。请注意,在收到许多请求后,该程序开始明显减慢速度。

代码

import requests, re
from bs4 import BeautifulSoup
import pandas as pd

players_list = [
    'https://www.baseball-reference.com/players/gl.fcgi?id=torregl01&t=b&year=2019',
    'https://www.baseball-reference.com/players/gl.fcgi?id=troutmi01&t=b&year=2019',
    'https://www.baseball-reference.com/players/gl.fcgi?id=lindofr01&t=b&year=2019'
]

all_dfs = {}
for player in players_list:
    r = requests.get(player)
    soup = BeautifulSoup(r.text, 'html.parser')
    dates = soup.find_all('td', attrs={'data-stat': 'date_game'})

    player_id = re.search(r'id=(\w+)', player).group(1)
    params = {
        'html': '1',
        'date_out': '1',
        't': 'b'
    }
    popup_url = 'https://www.baseball-reference.com/play-index/be.cgi'
    temp_df_holder = []
    for date in dates:
        if date.get('csk'):
            param_date = re.search(r'\.(\w+)', date['csk']).group(1)
            params['game-id'] = param_date + '-' + player_id
            popup = requests.get(popup_url, params=params)
            print(popup.url)
            df = pd.read_html(popup.text)
            temp_df_holder.append(df)
    all_dfs[player_id] = temp_df_holder
    print(f'Player {player_id} done')

print(all_dfs)