我一直在尝试抓取一张表格,用于对全国各地的设施进行映射分析。但是,我似乎无法做到
我已经尝试了下面的代码,并意识到这个网站上没有可用的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 使用了正确的类,因为我得到了一个空白的数据框。如果我也能收到一些关于遍历所有信息页面的指导,我将不胜感激。
R 的新手,但类似于以下内容,您定义了一个函数以从给定 url 检索行信息作为数据帧。循环访问您想要调用函数并将返回的 dfs 合并到一个大 df 中的页面数量。由于nodeList并不总是相同的长度,例如,并非每个列表都有电话号码,因此您需要测试元素是否存在于行的循环中。我在答案中使用了该方法 阿利斯泰尔(+给他(
我使用的是 css 选择器而不是 xpath。您可以在此处阅读有关它们的信息。
鉴于可能的页面的#,我会研究使用http会话。您可以获得重用连接的效率。我用其他语言使用它们;从快速的谷歌来看,似乎 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)
}
}