所以我想我知道我需要做什么了,也许很难看,但它是有效的。
library(xml2)
library(rvest)
library(plyr)
library(tidyverse)
SCP.read_xml <- function(file) {
some.html <- as_list(html_nodes(read_html(file), xpath = '//xyz'))
df <- list()
for (i in seq_along(some.html)) {
df[[i]] <- data.frame(
'pn' = some.html[[i]][["pn"]][[1]],
'date' = if (!is.null(some.html[[i]][["met"]][["date"]][[1]])) {
some.html[[i]][["met"]][["date"]][[1]]
} else if (!is.null(some.html[[i]][["waves"]][["date"]][[1]])) {
some.html[[i]][["waves"]][["date"]][[1]]
} else {
some.html[[i]][["gps"]][["date"]][[1]]
},
'lat' = ifelse(length(some.html[[i]][["gpslat"]]) > 0, some.html[[i]][["gpslat"]][[1]], NA),
'lon' = ifelse(length(some.html[[i]][["gpslon"]]) > 0, some.html[[i]][["gpslon"]][[1]], NA),
'msg' = some.html[[i]][["msg1"]][[1]]
)
}
test <- as_tibble(ldply(df, data.frame))
return(test)
}
SCP.read_xml('~/some_html.txt')
# A tibble: 4 x 5
pn date lat lon msg
<fct> <fct> <fct> <fct> <fct>
1 901392 2018-02-14T00:40:00Z 40 -100 " 'SOMESTRINGOFTEXT'"
2 902084 2018-02-14T00:40:00Z 40 -100 " 'SOMESTRINGOFTEXT'"
3 902077 2018-02-14T00:40:06Z 40 -100 " 'SOMESTRINGOFTEXT'"
4 901392 2018-02-14T00:50:00Z 40 -100 " 'SOMESTRINGOFTEXT'"
这使得我可以一次将函数应用于多条消息的列表,甚至可以一次性将它们组合成一个数据帧。我扩展了上面的代码,从这些消息中提取了许多(~85)变量。