Очистка DataTable с помощью rvest по идентификатору, не находит таблицу

#r #web-scraping #rvest

#r #очистка веб-страниц #rvest

Вопрос:

Я пытаюсь очистить данные из таблицы данных здесь, вызывая xpath id :

 library(rvest)
library(dplyr)

url <- "https://www.topuniversities.com/university-rankings/world-university-rankings/2018"  

h <- url %>% read_html() 

h %>% html_nodes(xpath = "//*[@id='qs-rankings-indicators']") %>% html_table()
 

Последняя команда выдает мне эту ошибку:

 Error in matrix(NA_character_, nrow = n, ncol = maxp) : 
  invalid 'ncol' value (too large or NA)
In addition: Warning messages:
1: In max(p) : no non-missing arguments to max; returning -Inf
2: In matrix(NA_character_, nrow = n, ncol = maxp) :
  NAs introduced by coercion to integer range
 

Чего мне здесь не хватает?

Ответ №1:

Эта таблица отображается с помощью javascript. Возможно, просто получите данные JSON непосредственно из источника. Попробуйте что-то вроде этого

 tstamp <- function() as.character(trunc(as.numeric(Sys.time()) * 1e3))
url <- "https://www.topuniversities.com/sites/default/files/qs-rankings-data/357051.txt"

res <- 
  jsonlite::fromJSON(paste0(url, "?_=", tstamp()))$data[, c(
    "rank_display", "score", "title", "country", "region"
  )]
 

Выходной сигнал

 > head(res)
  rank_display score                                        title        country        region
1            1   100  Massachusetts Institute of Technology (MIT)  United States North America
2            2  98.7                          Stanford University  United States North America
3            3  98.4                           Harvard University  United States North America
4            4  97.7 California Institute of Technology (Caltech)  United States North America
5            5  95.6                      University of Cambridge United Kingdom        Europe
6            6  95.3                         University of Oxford United Kingdom        Europe
 

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить мне немного подробнее о том, «Что таблица отображается с помощью JavaScript». Насколько это сложно для rvest?

2. Хорошее решение. @Damandeep rvest загрузит исходный HTML-код, но не будет запускать javascript. Хорошим примером загрузки данных в javascript является спортивный сайт, который изменяет счет без необходимости загрузки страницы (rvest ничего не узнает об обновленном счете, потому что он загружается через javascript после начальной загрузки HTML-страницы). То же самое происходит и здесь с данными внутри таблицы

3. Как вы можете определить, что таблица или содержимое отображаются с помощью javascript? Как вам удалось найти URL-адрес данных json?

4. Вы можете проверять сетевые действия с помощью современного браузера, такого как Chrome. Смотрите Это для получения подробного руководства. По сути, вы просто переходите на эту веб-страницу, щелкаете правой кнопкой мыши, выбираете inspect, выбираете network, обновляете страницу и выбираете XHR filter. Затем вы можете увидеть URL-адрес данных json. @DavidJorquera

5. Вы можете проверить исходную страницу html, чтобы узнать, отображается ли таблица с помощью JS или нет. Исходная страница HTML может быть получена путем проверки сетевых действий. @DavidJorquera

Ответ №2:

У вас на самом деле уже было это с just

 library(rvest)
library(dplyr)

url <- "https://www.topuniversities.com/university-rankings/world-university-rankings/2018"  

h <- url %>% read_html() 

h %>% 
  html_nodes(xpath = "//*[@id='qs-rankings-indicators']")

{xml_nodeset (1)}
[1] <table id="qs-rankings-indicators" class="order-column" cellspacing="0" width="100%"></table>
 

т.е. без последнего %>% html_table()

Причина отсутствия данных внутри таблицы заключается в том, что она загружается с помощью javascript после начальной загрузки HTML-страницы.

Чтобы получить таблицу, содержащую загруженный javascript-контент, вам нужно будет использовать инструмент очистки, который может запускать javascript веб-сайта (я бы рекомендовал RSelenium).