r - 在使用 rvest 进行网络抓取时向每个表添加一列
问题描述
我正在尝试抓取此网页上的最后五个日期。我有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
为每个表创建一个日期列(对应于每个日期)。我尝试在mutate(Date = seq_dates_test)
之后添加extract2
,但出现此错误...
mutate_impl(.data, dots) 中的错误:列
Date
的长度必须为 285(行数)或 1,而不是 5
更新:我将如何更改我的代码,以便如果表 X 的长度为 0,我会跳过该表并继续抓取下一个表?
解决方案
paste
是矢量化的,所以我们不需要做map2
. 我们可以直接paste
使用带有日期的 'url' 并提取表格并使用.id
'Date' 通过命名来创建列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
更新
如果我们需要进行错误检查并返回默认值,可以使用or tryCatch
或possibly
frompurrr
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="
推荐阅读
- javascript - 如何在移动视图reactjs中隐藏软键盘?
- python - ValueError:无法将输入数组从形状(50,50,3)广播到形状(50,50)
- c# - 将 tf 2.3 图形导入 Tensorflow.NET 时出现问题
- julia - 为许多类似功能实现多次调度的有效方法
- excel - 如何查找后期绑定参考的名称
- r - 结果的行数不是R中向量长度(arg 5)的倍数
- javascript - 从 OpenLayers 中的 GeoJSON 属性设置图标源
- angular - 以编程方式关闭所有打开的 cdk-overlay
- php - Symfony for PHP:使用 foreach 从会话向表中插入多行
- python-3.x - 推导表达式后如何通过 sympy 知道自动替换的值?