我正在尝试在此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,则跳过该表并继续抓取下一个表?
答案 0 :(得分:0)
paste
是矢量化的,因此我们不需要做map2
。我们可以直接用日期paste
{url}并提取表,然后使用.id
通过命名为vector
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
中的possibly
或purrr
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)
您的流程略有变化,因为我们希望为每个可以在Date
上map
而不是粘贴的网址的数据帧添加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="