首页 > 解决方案 > 带 rvest 的循环

问题描述

我对这一切都很陌生,并且正在尝试通过一些有关 stackoverflow 的示例来建立我的信心。

我通过@RonakShah 找到了这个答案

使用 rvest 抓取不在表中的数据

并认为我会使用它,因为我熟悉 HTML 来建立我对循环的信心。

我的问题是我无法使循环工作。

有人可以指出我要去哪里错了吗?这是我通过留言板找到的零碎代码,但我没有得到任何地方!

library(rvest)

page<- (0:2)
urls <- list()
for (i in 1:length(page)) {
  url<- paste0("https://concreteplayground.com/sydney/bars?page=",page[i])
  urls[[i]] <- url
}


tbl <- list()


j <- 1
for (j in seq_along(urls)) {
  tbl[[j]] <- urls[[j]] %>%   read_html()
  name <- tbl[[j]] %>% html_nodes('p.name a') %>%html_text() %>% trimws()
  address <- tbl[[j]] %>% html_nodes('p.address') %>% html_text() %>% trimws()
  links <- tbl[[j]] %>% html_nodes('p.name a') %>% html_attr('href')
  data.frame(name, address, links)
  j <- j+1                    
}

#convert list to data frame
tbl <- do.call(rbind, tbl)

标签: r

解决方案


直接使用创建 url paste0,无需循环。

library(rvest)
pages <- 1:2
urls <- paste0("https://concreteplayground.com/sydney/bars?page=", pages)

如果您将该页面上的代码放在一个函数中,您可以使用它map_df来直接获取组合数据框。map_dffor循环和do.call(rbind, tbl)一起的工作。

get_web_data <- function(url) {
  webpage <- url %>% read_html()
  name <- webpage %>% html_nodes('p.name a') %>%html_text() %>% trimws()
  address <- webpage %>% html_nodes('p.address') %>% html_text() %>% trimws()
  links <- webpage %>% html_nodes('p.name a') %>% html_attr('href')
  data.frame(name, address, links)
}

purrr::map_df(urls, get_web_data)

推荐阅读