【问题标题】:Scraping with rvest -- data has <table> tag but not found with html_table()用 rvest 抓取——数据有 <table> 标签,但用 html_table() 找不到
【发布时间】:2020-04-29 14:59:37
【问题描述】:

我正在尝试从this site 的表格中抓取一些高中体育成绩,但 rvest html_table() 函数什么也不返回……只是一个空列表。数据似乎清楚地位于 table 标记中,所以我认为这很简单,但并非如此。

html_data <- read_html("https://highschoolsports.nj.com/boysbasketball/schedule/2020/01/09")
html_data %>% html_table(html_data)

任何有关如何提取此表的帮助或建议将不胜感激!

【问题讨论】:

  • 您在第二行中缺少一两步,您从整页中提取包含所需表的节点,然后将该特定节点传递给对 html_table 的调用。
  • 看起来该表也是用 javascript 渲染的,这使得抓取更加困难。您可能需要深入研究该主题才能到达您想去的地方。

标签: r web-scraping rvest


【解决方案1】:

您看到的表格是使用 javascript 动态构建的。该页面发送一个包含表中所有数据的 json 文件的 xhr 请求(以及更多您看不到的数据)。

你需要做的是请求 json 文件,解析它并提取你想要的元素。以下脚本将为您完成:

library(tidyverse)
library(httr)
library(rjson)

"https://highschoolsports.nj.com/siteapi/games/schedule" %>%
modify_url( query = list( viewStart      = "1/9/2020",
                          sportId        = "15",
                          schoolId       = "",
                          scheduleYearId = ""))          %>%
GET()                                                    %>%
content("text")                                          %>%
fromJSON()                                               %>%
`[[`("games")                                            %>%
lapply(function(x) data.frame(x$gameDate, x$name))       %>%
{do.call("rbind", .)}                                    %>%
as_tibble                                                 ->
result

print(result)
#> # A tibble: 324 x 2
#>    x.gameDate          x.name                                            
#>    <fct>               <fct>                                             
#>  1 2020-01-09T00:00:00 Manville (43) at Pingry (77)                      
#>  2 2020-01-09T00:00:00 Eastern (41) at Cherokee (54)                     
#>  3 2020-01-09T00:00:00 Woodbridge (31) at Colonia (54)                   
#>  4 2020-01-09T00:00:00 Phillipsburg (64) at Bridgewater-Raritan (71)     
#>  5 2020-01-09T05:30:00 Asbury Park (44) at Point Pleasant Beach (50)     
#>  6 2020-01-09T07:00:00 Montclair Immaculate (78) at Newark East Side (49)
#>  7 2020-01-09T15:45:00 Christian Brothers (67) at Howell (62)            
#>  8 2020-01-09T16:00:00 West Caldwell Tech (59) at Weequahic (60)         
#>  9 2020-01-09T16:00:00 Scotch Plains-Fanwood (20) at Westfield (55)      
#> 10 2020-01-09T16:00:00 Summit (59) at Cranford (44)                      
#> # ... with 314 more rows

如果您在 json 中进行挖掘,很容易获得个人分数等,因此如果您想要在数据框列中包含此数据的表,您可以更改 lapply 命令中的函数以选择那些您希望作为数据框中的条目。

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多