Очистка с помощью rvest - данные имеют тег <table>, но не найдены с помощью html_table () - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь вычеркнуть некоторые результаты школьных спортивных состязаний из таблиц на этом сайте , но функция rvest html_table () ничего не возвращает ... просто пустой список. Кажется, что данные явно находятся внутри тега table , поэтому я подумал, что это будет довольно просто, но не так.

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

Любая помощь или совет относительно того, как извлечь эту таблицу, с благодарностью!

1 Ответ

4 голосов
/ 12 января 2020

Таблица, которую вы видите, динамически строится с использованием javascript. Страница отправляет запрос xhr для файла json, который содержит все данные в таблице (плюс намного больше данных, которые вы не можете видеть).

Что вам нужно сделать, это запросить 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, легко получить отдельные баллы и т.д. c, поэтому, если вам нужна таблица с этими данными в столбцах фрейма данных вы должны изменить функцию в команде lapply, чтобы выбрать те, которые вы хотите использовать в качестве записей в вашем фрейме данных.

...