Ввод NA, где отсутствуют значения при очистке с помощью rvest

Я хочу использовать rvest, чтобы очистить страницу, на которой есть заголовки и время выступлений на недавней конференции, а затем объединить значения в таблицу.

library(tibble)
library(rvest)

url <- "https://channel9.msdn.com/Events/useR-international-R-User-conferences/useR-International-R-User-2017-Conference?sort=status&direction=desc&page=14"

title <- page %>% 
      html_nodes("h3 a") %>% 
      html_text()

length <- page %>% 
      html_nodes(".tile .caption") %>% 
      html_text()

df <- tibble(title,length)

Если вы посмотрите на страницу, вы увидите, что для одного из разговоров нет никакой ценности - а в View source нет class="caption" для этого разговора

Есть ли способ, которым я могу заменить NA показать пропущенные значения?

1 ответ

Решение

Самый простой способ - выбрать узел, который включает в себя оба узла, которые вы хотите для каждой строки, а затем выполнить итерацию по ним, вытягивая оба узла, которые вы хотите сразу. purrr::map_df удобен не только для итерации, но и для объединения результатов в красивый тиббл:

library(rvest)
library(purrr)

url <- "https://channel9.msdn.com/Events/useR-international-R-User-conferences/useR-International-R-User-2017-Conference?sort=status&direction=desc&page=14"

page <- read_html(url)

df <- page %>% 
    html_nodes('article') %>%    # select enclosing nodes
    # iterate over each, pulling out desired parts and coerce to data.frame
    map_df(~list(title = html_nodes(.x, 'h3 a') %>% 
                     html_text() %>% 
                     {if(length(.) == 0) NA else .},    # replace length-0 elements with NA
                 length = html_nodes(.x, '.tile .caption') %>% 
                     html_text() %>% 
                     {if(length(.) == 0) NA else .}))

df
#> # A tibble: 12 x 2
#>                                                                                title   length
#>                                                                                <chr>    <chr>
#>  1                             Introduction to Natural Language Processing with R II 01:15:00
#>  2                                Introduction to Natural Language Processing with R 01:22:13
#>  3                                          Solving iteration problems with purrr II 01:22:49
#>  4                                             Solving iteration problems with purrr 01:32:23
#>  5                           Markov-Switching GARCH Models in R: The MSGARCH Package    15:55
#>  6                    Interactive bullwhip effect exploration using SCperf and Shiny    16:02
#>  7                             Actuarial and statistical aspects of reinsurance in R    14:15
#>  8                                                            Transformation Forests    16:19
#>  9                                                         Room 2.02 Lightning Talks    50:35
#> 10                                   R and Haskell: Combining the best of two worlds    14:45
#> 11 *GNU R* on a Programmable Logic Controller (PLC) in an Embedded-Linux Environment     <NA>
#> 12     Performance Benchmarking of the R Programming Environment on Knight's Landing    19:32

У меня была та же проблема, но мне удалось заставить ее работать, не задействуя узел, который включает два из указанных узлов.

С вашим кодом это будет:

library(tibble)
library(rvest)

url <- "https://channel9.msdn.com/Events/useR-international-R-User-conferences/useR-International-R-User-2017-Conference?sort=status&direction=desc&page=14"

title <- page %>% 
      html_nodes("h3 a") %>% 
      html_text() %>% 
                     {if(length(.) == 0) NA else .

length <- page %>% 
      html_nodes(".tile .caption") %>% 
      html_text() %>% 
                     {if(length(.) == 0) NA else .

df <- tibble(title,length)
Другие вопросы по тегам