r не может найти номера страниц сайта в списках - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу взять количество страниц с веб-сайта. Я пытаюсь сделать это как на учебник . Я использовал эту функцию:

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))

для веб-сайта

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

работает нормально. Когда я пытался сделать это с

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

, я получил целое число (0).

Я изменил

html_nodes('.pagination-page') 

на

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

И не удалось. Как я могу изменить свой код, чтобы он работал нормально?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Я думаю, что здесь вы должны пойти немного по-другому.

energybase.ru URL организован не так, как TrustPilot URL .

Для наших целей мы заинтересованы в том, чтобы последняя страница имела собственный узел .last. Оттуда вам просто нужно извлечь значение атрибута data-page и увеличить его на 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

Редактировать: заметьте, вы всегда можете перехватить трубопровод на html_children() (добавив %>% html_attrs() к нему), чтобы узнать, какие атрибуты доступны в вашем распоряжении.

1 голос
/ 03 ноября 2019

Вы можете использовать узел rel = last attribute = value и извлечь число из 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()

Или есть несколько способов, которыми вы можете рассчитать его, учитывая, что страниц больше, чем нумерация страницЗапись видна. Одним из способов является получение общего количества из соответствующего li в раскрывающемся списке и деление на результаты на количество страниц.

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)
...