Очистка страниц с непоследовательной длиной в кадре данных - PullRequest
1 голос
/ 06 января 2020

Я хочу вычеркнуть все имена из этой страницы . В результате один столбик из трех столбцов. Мой код работает только в том случае, если все данные есть, поэтому моя ошибка:

 Error: Tibble columns must have consistent lengths, only values of length one are recycled:
* Length 20: Columns `huisarts`, `url`
* Length 21: Column `praktijk`

Как мне разрешить выполнение моего кода, но заполнить его Na в tibble, если данных там нет.

Мой код робота-паузу, который позже использовался в функции скребка:

pauzing_robot <- function (periods = c(0, 1)) {
      tictoc <- runif(1, periods[1], periods[2])
      cat(paste0(Sys.time()), 
          "- Sleeping for ", round(tictoc, 2), "seconds\n")
      Sys.sleep(tictoc)
    }

Скребок:

library(tidyverse)
library(rvest)

scrape_page <- function(pagina_nummer) {

  page <- read_html(paste0("https://www.zorgkaartnederland.nl/huisarts/pagina", pagina_nummer)) 

  pauzing_robot(periods = c(0, 1.5))

  tibble(

    huisarts = page %>% 
      html_nodes(".media-heading.title.orange") %>% 
      html_text() %>% 
      str_trim(), 

    praktijk = page %>% 
      html_nodes(".location") %>% 
      html_text() %>%
      str_trim(),

    url = page %>% 
      html_nodes(".media-heading.title.orange") %>% 
      html_nodes("a") %>%
      html_attr("href") %>% 
      str_trim() %>% 
      paste0("https://www.zorgkaartnederland.nl", .)
  )
}

Общее количество страниц 445, но, например, только для очистки три:

huisartsen <- map_df(sample(1:3), scrape_page)

Страница 2, кажется, проблема с несовместимыми длинами, потому что этот код работает:

huisartsen <- map_df(3:4, scrape_page)

Если возможно с кодом tidyverse. Заранее спасибо.

1 Ответ

2 голосов
/ 06 января 2020

Вам необходимо получить список родительских узлов

parents <- page %>% html_nodes("li.media")

Затем проанализировать родительские узлы с помощью функции html_node().

tibble(
    huisarts = parents %>% 
      html_node(".media-heading.title.orange") %>% 
      html_text() %>% 
      str_trim(), 

    praktijk = parents %>% 
      html_node(".location") %>% 
      html_text() %>%
      str_trim(),

    url = parents %>% 
      html_node(".media-heading.title.orange a") %>% 
      html_attr("href") %>% 
      str_trim() %>% 
      paste0("https://www.zorgkaartnederland.nl", .)
  ) 

Функция html_node всегда будет возвращать значение, даже если это просто NA

...