【问题标题】:scrape a table with rvest in R that has mismatch table heading用 R 中的 rvest 刮掉一个表标题不匹配的表
【发布时间】:2020-05-30 18:50:47
【问题描述】:

我正在尝试抓取这张桌子,这看起来非常简单。 这是表格的网址:https://fantasy.nfl.com/research/scoringleaders?position=1&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1

这是我的代码:

url <- "https://fantasy.nfl.com/research/scoringleaders?position=1&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1"
x = data.frame(read_html(url) %>% 
  html_nodes("table") %>% 
  html_table())

这工作正常,但给出了非常奇怪的两行标题,当我尝试添加 %>% slice(-1) 以取出第一行时,它说我不能,因为它是一个列表。真的很想弄清楚如何做到这一点。

【问题讨论】:

  • 现在,输出是一个列表。您想将其转换为数据框。 html_table() %&gt;% as.data.frame 将列表转换为数据框。然后,您可以根据需要使用 slice()。

标签: r web-scraping rvest


【解决方案1】:

这是一种解决方案。下面是一个解释。

library(rvest)
library(tidyverse)

read_html(url) %>% 
  html_nodes("table") %>%  
  html_table(header = T) %>%
  simplify() %>% 
  first() %>% 
  setNames(paste0(colnames(.), as.character(.[1,]))) %>%
  slice(-1) 

glimpse()的输出:

Observations: 25
Variables: 16
$ Rank          <chr> "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"…
$ Player        <chr> "Lamar Jackson QB - BAL", "Dak Prescott QB - DAL", "Deshaun W…
$ Opp           <chr> "@MIA", "NYG", "@NO", "@ARI", "@JAX", "@PHI", "PIT", "WAS", "…
$ PassingYds    <chr> "324", "405", "268", "385", "378", "380", "341", "313", "248"…
$ PassingTD     <chr> "5", "4", "3", "3", "3", "3", "3", "3", "3", "3", "2", "2", "…
$ PassingInt    <chr> "-", "-", "1", "-", "-", "-", "-", "-", "-", "1", "1", "1", "…
$ RushingYds    <chr> "6", "12", "40", "22", "2", "-", "-", "5", "24", "6", "13", "…
$ RushingTD     <chr> "-", "-", "1", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ ReceivingRec  <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ ReceivingYds  <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ ReceivingTD   <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ RetTD         <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ MiscFumTD     <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ Misc2PT       <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "1", "-", "…
$ FumLost       <chr> "-", "-", "-", "1", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ FantasyPoints <chr> "33.56", "33.40", "30.72", "27.60", "27.32", "27.20", "25.64"…

说明
来自?html_table docs:

html_table 目前做了一些假设:

  • 没有单元格跨越多行
  • 标题在第一行

通过在html_table() 中设置header = TRUE 可以解决部分问题。

问题的另一部分是标题单元格跨越两行,这是html_table() 没有预料到的。

假设您不想丢失任一标题行中的信息,您可以:

  1. 使用simplifyfirsthtml_table得到的列表中拉出数据框
  2. 使用setNames合并两个标题行(现在是数据框列和第一行)
  3. slice 删除第一行(现在是多余的)

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2012-01-02
    • 2015-04-15
    • 2020-04-14
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2019-11-18
    • 2016-03-08
    相关资源
    最近更新 更多