Скребковый стол с rvest и xpath для отображения местоположения - PullRequest
1 голос
/ 11 июля 2019

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

Я попробовал приведенный ниже код и понял, что на этом сайте нет таблицы html.

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

table <- url %>%
  read_html() %>%
  html_nodes(xpath='//*[@id="views-form-resource-guide-results-page-1-results"]/div[1]') 

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

1 Ответ

0 голосов
/ 12 июля 2019

Я новичок в R, но что-то вроде следующего, где вы определяете функцию для извлечения информации о строке в виде фрейма данных из данного URL.Зацикливайтесь на том, сколько страниц вы хотите вызвать, вызывая функцию и объединяя возвращенные dfs в один большой df.Поскольку ноды не всегда имеют одинаковую длину, например, не во всех листингах есть телефонный номер, вам нужно проверить, присутствует ли элемент в цикле над строками.Я использую метод в ответе alistaire (+ к нему)

Я использую селекторы css, а не xpath.Вы можете прочитать о них здесь .

Учитывая количество возможных страниц, которые я хотел бы изучить, используя сеанс http.Вы получаете эффективность повторного использования соединения.Я использую их на других языках;из быстрого Google, кажется, R обеспечивает это, например, с html_session .

Я бы приветствовал предложения по улучшению и любые правки для исправления отступа.Я учусь на ходу.

library(rvest)
library(magrittr)
library(purrr)


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

get_listings <- function(url){
    df <- read_html(url) %>% 
      html_nodes('.views-row') %>%
      map_df(~list(
                   title = html_node(.x, '.service-card__title a')%>% html_text(),
                   location = trimws(gsub('\n', ' ',html_text(html_node(.x, '.service-card__address')))) %>% 
                              {if(length(.) == 0) NA else .}, 
                    telephone = html_node(.x, '.service-card__phone') %>% html_text() %>% 
                              {if(length(.) == 0) NA else .}
                  )
             )
      return(df)
}

pages_to_loop = 2

for(i in seq(1, pages_to_loop)){
  new_url <- paste0(url, i, sep= '')
  if(i==1){
    df <-  get_listings(new_url)
  } else {
    new_df <- get_listings(new_url)
    df <- rbind(df, new_df)
  }
}
...