使用rvest和xpath刮取表以进行位置映射

时间:2019-07-11 18:30:05

标签: r xpath web-scraping rvest

我一直在努力抓取一张表格,以便对该国各地的设施进行地图分析。但是,我似乎无法设法

我已经尝试了下面的代码,但发现此网站上没有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 :(得分:0)

我是R的新手,但是类似下面的内容,您在其中定义了一个函数,用于从给定的URL中检索行信息作为数据框。循环查看要调用该函数并将返回的dfs合并为一个大df的页面数。由于nodeList的长度并不总是相同的,例如并非每个列表都有一个电话号码,您需要测试元素是否在行中的循环中存在。我在alistaire(对他+)中使用答案中的方法

我使用的是CSS选择器,而不是xpath。您可以阅读关于它们的here

考虑到使用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)
  }
}