簡體   English   中英

將動態加載的表轉換為Pandas Dataframe

[英]Convert dynamically loaded table into Pandas Dataframe

在Windows設備上運行Python 3.6.1 | Anaconda 4.4.0(64位)。

使用我收集以下html源:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

url = "https://nextgenstats.nfl.com/stats/receiving#yards"
driver = webdriver.Chrome(executable_path=r"C:/Program Files (x86)/Google/Chrome/chromedriver.exe")
driver.get(url)
htmlSource = driver.page_source

如果檢查URL,他們將看到一個動態加載的漂亮表。 我不確定如何從htmlsource提取此表,以便可以從中構造Pandas數據htmlsource

你很親密 您只需要在這里幫助熊貓。 簡而言之,這就是您需要做的事情。

  1. 將源加載到BeautifulSoup
  2. 查找有問題的表。 使用soup.find
  3. 致電pd.read_html
from bs4 import BeautifulSoup

soup = BeautifulSoup(htmlSource, 'html.parser')
table = soup.find('div', class_='ngs-data-table')

df_list = pd.read_html(table.prettify())

現在, df_list包含該頁面上所有表的列表-

df_list[1].head()

                0    1   2    3    4     5      6   7    8      9     10  11
0    Antonio Brown  PIT  WR  4.3  2.6  13.7  45.32  99  160  61.88  1509   9
1  DeAndre Hopkins  HOU  WR  4.6  2.1  13.1  42.19  88  155  56.77  1232  11
2     Adam Thielen  MIN  WR  5.8  2.6  11.0  37.38  80  124  64.52  1161   4
3      Julio Jones  ATL  WR  5.2  2.4  14.2  43.34  73  118  61.86  1161   3
4     Keenan Allen  LAC  WR  5.4  2.6   9.5  31.30  83  129  64.34  1143   5

作為Scrapy用戶,我習慣查看XHR請求。 如果您更改站點的年份,則會看到對https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG的API調用

該API返回JSON,因此對數據使用read_json之類的JSON解析器是read_json的。

在此處輸入圖片說明

這是使用Scrapy shell的方法:

$ scrapy shell

In [1]: fetch("https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG")
2017-12-15 13:11:30 [scrapy.core.engine] INFO: Spider opened
2017-12-15 13:11:31 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG> (referer: None)

In [2]: import pandas as pd

In [3]: data = pd.read_json(response.body)

In [4]: data.keys()
Out[4]: Index([u'season', u'seasonType', u'stats', u'threshold'], dtype='object')

In [5]: pd.DataFrame(list(data['stats']))

如果您沒有草率,可以使用requests

import requests
import pandas as pd

url = "https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG"

response = requests.get(url)
data = pd.read_json(response.text)
df = pd.DataFrame(list(data['stats']))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM