Skip to main content
 首页 » 编程设计

python之Web 抓取不使用 table> 的表 (Python)

2025年02月15日5emanlee

我是编程新手,所以如果这真的很简单,我深表歉意。我对 Python 有非常基本的了解,并且一直在努力学习如何提取在这个网站上看到的表格:https://rotogrinders.com/grids/nfl-targets-1402017?site=draftkings .问题是该表未设置为传统的 HTML 表,但实际上是由 <div> 制成的s 并且似乎是通过脚本填充的?我一直在尽最大努力寻找已解决的类似情况,但我不确定我是否正确搜索。到目前为止,这是我的代码:

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

自从我遇到这个问题后,我并没有走多远。如果您知道可能的解决方案或我可以学习的示例,请告诉我。

请您参考如下方法:

在这种情况下,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:

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' ... } 

哒哒!