Quiero tomar varias páginas del sitio web. Trato de hacerlo como en titorial Usé esta función:

get_last_page <- function(html){

  pages_data <- html %>% 
                  # The '.' indicates the class
                  html_nodes('.pagination-page') %>% 
                  # Extract the raw text as a list
                  html_text()                   

  # The second to last of the buttons is the one
  pages_data[(length(pages_data)-1)] %>%            
    # Take the raw string
    unname() %>%                                     
    # Convert to number
    as.numeric()                                     
}
first_page <- read_html(url)
(latest_page_number <- get_last_page(first_page))

para el sitio web

url <-'http://www.trustpilot.com/review/www.amazon.com'

funciona bien. Cuando traté de hacerlo con

url <-'https://energybase.ru/en/oil-gas-field/index'

Tengo entero(0).

Cambio

html_nodes('.pagination-page') 

Para

html_nodes('.html_nodes('data-page')') 

Y fracasó. ¿Cómo puedo cambiar mi código para que funcione bien?

0
Владимир Кузовкин 3 nov. 2019 a las 20:51

2 respuestas

Creo que tienes que hacer esto un poco diferente aquí.

La energybase.ru URL No está organizada de la misma manera que el TrustPilot URL .

Para nuestros propósitos aquí, estamos interesados en el hecho de que la última página tiene su propio nodo .last. A partir de ahí, solo tiene que extraer el valor del atributo data-page e incrementarlo en 1.

library("rvest") 
library("magrittr")

url <- 'https://energybase.ru/en/oil-gas-field/index'

read_html(url) %>% html_nodes(".last") %>% html_children() %>% html_attr("data-page") %>% as.numeric()+1
# [1] 21

Editar: tenga en cuenta que siempre puede interceptar la tubería en html_children() (agregando un %>% html_attrs()) para averiguar qué atributos están disponibles a su disposición allí.

1
Dunois 3 nov. 2019 a las 19:07

Puede usar el nodo rel = last attribute = value y extraer el número de href

library("rvest") 
library("magrittr")

pg <- read_html('https://energybase.ru/en/oil-gas-field/index')
number_of_pages <- str_match_all(pg %>% html_node("[rel=last]") %>% html_attr("href"),'page=(\\d+)')[[1]][,2] %>% as.numeric()

O bien, hay varias formas de calcularlo dado que hay más páginas que la paginación visible. Una forma es obtener el recuento total del li apropiado en el menú desplegable y dividirlo por los resultados por recuento de páginas.

library(rvest)
library(magrittr)

pg <- read_html('https://energybase.ru/en/oil-gas-field/index')
total_sites <- strtoi(pg %>% html_node('#navbar-facilities > li:nth-child(13)') %>% html_attr('data-amount'), base = 0L)
# or use: total_sites <- pg %>% html_node('#navbar-facilities > li:nth-child(13)') %>% html_attr('data-amount') %>% as.numeric()
sites_per_page <- length(pg %>% html_nodes('.index-list-item'))
number_of_pages <- ceiling(total_sites/sites_per_page)
0
QHarr 3 nov. 2019 a las 19:11