我一直在努力抓取一张表格,以便对该国各地的设施进行地图分析。但是,我似乎无法设法
我已经尝试了下面的代码,但发现此网站上没有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使用正确的类,因为我得到的是空白数据框。如果我也能获得有关遍历所有信息页面的一些指导,我将不胜感激。
答案 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)
}
}