使用dplyr收集数据并绑定收集的数据行

时间:2018-10-10 18:54:47

标签: r dplyr rvest

我正在尝试使用rvest()提取一些信息。我只有一个链接列表,我想将收集的数据行绑定在一起。

我目前所拥有的是:

编辑:这是没有周末数据的链接

    links <- c("https://finance.yahoo.com/calendar/ipo?day=2018-03-05", "https://finance.yahoo.com/calendar/ipo?day=2018-03-06", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-07", "https://finance.yahoo.com/calendar/ipo?day=2018-03-08", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-09", "https://finance.yahoo.com/calendar/ipo?day=2018-03-12", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-13", "https://finance.yahoo.com/calendar/ipo?day=2018-03-14", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-15", "https://finance.yahoo.com/calendar/ipo?day=2018-03-16", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-19", "https://finance.yahoo.com/calendar/ipo?day=2018-03-20", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-21", "https://finance.yahoo.com/calendar/ipo?day=2018-03-22", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-23", "https://finance.yahoo.com/calendar/ipo?day=2018-03-26", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-27", "https://finance.yahoo.com/calendar/ipo?day=2018-03-28", 
"https://finance.yahoo.com/calendar/ipo?day=2018-03-29", "https://finance.yahoo.com/calendar/ipo?day=2018-03-30", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-02", "https://finance.yahoo.com/calendar/ipo?day=2018-04-03", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-04", "https://finance.yahoo.com/calendar/ipo?day=2018-04-05", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-06", "https://finance.yahoo.com/calendar/ipo?day=2018-04-09", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-10", "https://finance.yahoo.com/calendar/ipo?day=2018-04-11", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-12", "https://finance.yahoo.com/calendar/ipo?day=2018-04-13", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-16", "https://finance.yahoo.com/calendar/ipo?day=2018-04-17", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-18", "https://finance.yahoo.com/calendar/ipo?day=2018-04-19", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-20", "https://finance.yahoo.com/calendar/ipo?day=2018-04-23", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-24", "https://finance.yahoo.com/calendar/ipo?day=2018-04-25", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-26", "https://finance.yahoo.com/calendar/ipo?day=2018-04-27", 
"https://finance.yahoo.com/calendar/ipo?day=2018-04-30", "https://finance.yahoo.com/calendar/ipo?day=2018-05-01", 
"https://finance.yahoo.com/calendar/ipo?day=2018-05-02", "https://finance.yahoo.com/calendar/ipo?day=2018-05-03", 
"https://finance.yahoo.com/calendar/ipo?day=2018-05-04", "https://finance.yahoo.com/calendar/ipo?day=2018-05-07", 
"https://finance.yahoo.com/calendar/ipo?day=2018-05-08", "https://finance.yahoo.com/calendar/ipo?day=2018-05-09", 
"https://finance.yahoo.com/calendar/ipo?day=2018-05-10")

代码:

library(rvest)
library(dplyr)
library(magrittr)
x <- links %>% 
  read_html() %>% 
  html_table() %>%
  extract2(1) %>%
  bind_rows() %>%
  as_tibble

这将产生以下错误: Error in doc_parse_file(con, encoding = encoding, as_html = as_html, options = options) : Expecting a single string value: [type=character; extent=68].

我能够使代码适用于1个链接,但是当我尝试使其适用于所有链接时,我遇到了错误。例如,此代码有效:

x <- "https://finance.yahoo.com/calendar/ipo?day=2018-05-08" %>% 
  read_html() %>% 
  html_table() %>%
  extract2(1) %>%
  bind_rows() %>%
  as_tibble

编辑:

from = "2016-03-04"
to = "2018-05-10"


s <- seq(as.Date(from), as.Date(to), "days")
library(chron)
s <- s[!is.weekend(s)]  
links <- paste0("https://finance.yahoo.com/calendar/ipo?day=", s)



library(rvest)
library(dplyr)
library(magrittr)
library(purrr)
library(naniar)

IPOs <- links[1:400] %>% 
  map_dfr(~read_html(.x) %>% 
            html_table() %>%
            extract2(1) %>%
            naniar::replace_with_na_all(condition = ~.x == "-") %>%
            type.convert(as.is = TRUE) )

1 个答案:

答案 0 :(得分:1)

您似乎想遍历URL。对于每个要读取的数据,将其解析为一个数据帧,然后提取列表中的第一个数据帧。因此,read_html()extract2()步骤应在循环内完成。

一种选择是使用purrr::map_dfr()循环,因为看起来您最终想要将内容绑定到单个小标题中。

名义上看起来像这样:

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

links %>% 
     map_dfr(~read_html(.x) %>% 
              html_table() %>%
              extract2(1) )

但是,事实证明您缺少用连字符(-)表示的值。有些表有这些,有些没有。如果存在这些字符,则R会将整数列读取为字符,而如果不存在,R会将整数读取为整数列。当将所有内容绑定在一起时,这会导致问题。

我没有在read_html()中看到可以直接处理这些参数的参数(我在寻找na.strings中的read.table()或{{1}中的na的等效项}。我的解决方法是使用软件包{strong> naniar 中的函数readr::read_csv()将连字符转换为NA(请参见vignette here)。然后,我用replace_with_na_all()将所有列转换为适当的类型。

所有这些操作都是在type.convert()循环内完成的。

下面是一个示例,其中map_dfr()中仅前两个URL。

links