Webscraping不使用<Table>(Python)的表

2024-04-27 00:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个非常新的编程,所以我道歉,如果这真的很简单。我已经掌握了Python的基本知识,并且一直在尝试学习如何提取这个网站上的表:https://rotogrinders.com/grids/nfl-targets-1402017?site=draftkings。问题是,该表不是作为传统的HTML表设置的,而是由<div>构成的,似乎是通过脚本填充的?我一直在四处寻找,试图找到一个类似的情况已经解决,但我不知道我是否搜索正确。以下是我目前的代码:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://rotogrinders.com/grids/nfl-targets-1402017?site=draftkings")

soup = BeautifulSoup(page.content, 'html.parser')

table = soup.find('div', attrs={'class': 'bat'})

print(table.prettify())

我没走多远就遇到了这个问题。如果你知道一个可能的解决方案或一个例子,我可以学习,请让我知道。你知道吗


Tags: httpsimportdivcompagetablesiterequests
1条回答
网友
1楼 · 发布于 2024-04-27 00:17:11

在这种情况下,seleniumBeautifulSoup结合起来就很方便了。除此之外,通常还需要使用浏览器仔细检查元素。你知道吗

在本例中,我使用了Firefox(这要求geckodriver正确安装并放置在适当的位置),但是您也可以使用Chrome或您选择的任何浏览器。你知道吗

from selenium import webdriver
from bs4 import BeautifulSoup
from collections import OrderedDict
import more_itertools

# open Firefox to get the data

driver = webdriver.Firefox()
driver.get('https://rotogrinders.com/grids/nfl-targets-1402017?site=draftkings')
soup = BeautifulSoup(driver.page_source, 'lxml')
driver.quit()

# extract data from BeautifulSoup object

player_data = soup.find_all('div', attrs={'class':'rgt-col'})
text = [y.text for x in player_data for y in x.descendants if y.name == 'div']

indices_to_delete = [i for i in range(0, len(text), 250)]
keys = [text[k] for k in indices_to_delete]

new_text = [x for x in text if not x in keys]
text = list(more_itertools.sliced(new_text, 249))
new_text = list(zip(*text))

# build the dict

players = OrderedDict()

for x in new_text:
    y = list(zip(keys, x))
    for key, val in y:
        if key == 'Player':
            players[val] = {}
            current_player = val
        else:
            players[current_player][key] = val

。。。所以,当你print(players),你会得到一个很好的排序信息:

OrderedDict([
    ('DeAndre Hopkins', {
        'Salary': '$6200', 
        'Pos': 'WR', 
        'Opp': 'NEP', 
        'Team': 'HOU', 
        'GP': '2', 
        'Targets': '29', 
        'RzTar': '3', 
        'PoW Tar': '48.33%', 
        'Week 1': '16', 
        'Week 2': '13', 
        'Week 3': '\xa0', 
        'Week 4': '\xa0', 
        'Yards': '128', 
        'YPT': '4.41', 
        'Rec': '14', 
        'Rec Rate': '48.28%'}), 
    ('Dez Bryant', {
        'Salary': '$6800', 
        'Pos': 'WR', 
        'Opp': 'ARI', 
        'Team': 'DAL', 
        'GP': '2', 
        'Targets': '25', 
        'RzTar': '5', 
        'PoW Tar': '28.74%', 
        'Week 1': '9', 
        'Week 2': '16', 
        'Week 3': '\xa0', 
        'Week 4': '\xa0', 
        'Yards': '102', 
        'YPT': '4.08', 
        'Rec': '9', 
        'Rec Rate': '36.00%'}
     ) ... ])

。。。也就是说你可以这样做:

>>> players['DeAndre Hopkins']
{'Salary': '$6200', 'Pos': 'WR' ... }

嗒嗒!你知道吗

相关问题 更多 >