使用rvest进行网页抓取时,在每个表格上添加一列

时间:2019-03-25 15:17:28

标签: r rvest purrr

我正在尝试在此webpage上刮取最后五个日期。这里有seq_dates_test(我要在该网页上抓取的日期序列):

structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")

我正在使用下面的代码块成功抓取这些日期

url <- "http://mcsafetyfeed.org/incidents.php?date="

url %>% 
  map2_chr(seq_dates_test,paste0) %>% 
  map_df(. %>% 
    read_html() %>% 
      html_nodes("table") %>% 
    html_table(header = TRUE) %>%
    # Extract out first element of list
    magrittr::extract2(1)
    )

但是,我想为每个表(对应于每个日期)mutate创建一个Date列。我尝试在mutate(Date = seq_dates_test)之后添加extract2,但出现此错误...

  

mutate_impl(.data,点)中的错误:Date列的长度必须为285(行数)或一个,而不是5



更新:如何更改代码,以便如果表X的长度为0,则跳过该表并继续抓取下一个表?

2 个答案:

答案 0 :(得分:0)

paste是矢量化的,因此我们不需要做map2。我们可以直接用日期paste {url}并提取表,然后使用.id通过命名为vector

来创建列“ Date”。
library(tidyverse)
out <- map_df(set_names(paste0(url, seq_dates_test), seq_dates_test), ~
      .x %>% 
         read_html() %>% 
         html_nodes("table") %>% 
         html_table(header = TRUE) %>%    
         magrittr::extract2(1), .id = 'Date')

dim(out)
#[1] 1365    6

head(out)
#        Date     Time                                                         Event                               Address     Responding Agency
#1 2019-03-20 23:51:00                                             Parking complaint              1398 DEWEY AV, Rochester Rochester City Police
#2 2019-03-20 23:12:00 Dangerous condition - no immediate danger to life or property        2970 W HENRIETTA RD, Henrietta  Monroe County Police
#3 2019-03-20 22:50:00                                                 Odor of smoke          2349 E RIDGE RD, Irondequoit     Ridge Culver Fire
#4 2019-03-20 22:44:00                                           Dangerous condition          DENISE RD/LAKE AV, Rochester Rochester City Police
#5 2019-03-20 22:00:00                                             Parking complaint               3150 W RIDGE RD, Greece         Greece Police
#6 2019-03-20 21:58:00           Accident of motor vehicles involving unknown injury SB RT 590 AT BROWNCROFT BL, Rochester New York State Police
#       Event ID
#1 CTYP190793429
#2 MCOP190793334
#3 RCUF190793284
#4 CTYP190793264
#5 GREP190793188
#6 NYSP190793186

更新

如果我们需要进行错误检查并返回默认值,则可以使用tryCatch中的possiblypurrr

f1 <- function(x) {
        x %>%
           read_html() %>% 
           html_nodes("table") %>% 
           html_table(header = TRUE) %>%    
           magrittr::extract2(1)


}            
pos1 <- possibly(f1, otherwise = NULL, quiet = TRUE)

outlst1 <- map(set_names(paste0(url, seq_dates_test), 
                  seq_dates_test), pos1, .id = 'Date')

,然后滤除NULL元素

bind_rows(discard(outlst1, is.null))

数据

seq_dates_test <- structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")
url <- "http://mcsafetyfeed.org/incidents.php?date="

答案 1 :(得分:0)

您的流程略有变化,因为我们希望为每个可以在Datemap而不是粘贴的网址的数据帧添加seq_dates_test的新列。

library(rvest)

map(seq_dates_test, function(x) 
         paste0(url, x) %>%
               read_html() %>% 
               html_nodes("table") %>% 
               html_table(header = TRUE) %>%
               magrittr::extract2(1) %>%
               mutate(Date = x))

数据

seq_dates_test <- structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")
url <- "http://mcsafetyfeed.org/incidents.php?date="