R: веб-извлечение нескольких переменных из таблицы
Я пытаюсь отсканировать веб-страницу ( https://aviation-safety.net/database/dblist.php?Year=1986&lang=&page=1) в R, используя следующий код:
install.packages("rvest")
library(rvest)
aviationurl = "https://aviation-safety.net/database/dblist.php?Year=1986"
webpage = read_html(aviationurl)
# define variables of interest
variables = c("Date","Type","Registration","Operator","Fat","Location","Flag","Picture","Category")
# create sequence of numbers (as CSS for each variable contains a number)
colnums = seq(1,length(variables))
# write commands for pulling each variable into an R dataframe and executing them
eval(parse(paste(variables," = as.data.frame(html_text(html_nodes(webpage,'td:nth-child(",colnums,")')))",sep="")))
# create final table with all variables
df = cbind(parse(variables))
Однако после команды eval я получаю следующее сообщение об ошибке:
Ошибка в файле (имя файла, "r"): неверный аргумент "description". Дополнительно: Предупреждающее сообщение: In if (file == "") {: условие имеет длину> 1, и будет использоваться только первый элемент
Если я использую команду вставки без eval(parse()) и вручную C+P, получающиеся строки, они работают нормально. Так почему же R не оценит их правильно?
Открыт для альтернативных предложений, хотя хотел бы знать, почему eval не работает и могу ли я что-нибудь сделать, чтобы это сработало.
Спасибо!
мистифицировать
2 ответа
Я думаю, что это решает вашу проблему.
library(rvest)
aviationurl = "https://aviation-safety.net/database/dblist.php?
Year=1986"
webpage = read_html(aviationurl)
table <- as.data.frame(html_table(html_nodes(webpage, "table")))
head(table)
date type registration
1 03-JAN-1986 Antonov An-2T CCCP-06101
2 13-JAN-1986 BN-2A-6 Islander C-GTPB
3 15-JAN-1986 Dassault Falcon 10 F-GBTC
4 15-JAN-1986 Boeing 737-2A8 Advanced VT-EGD
5 16-JAN-1986 Antonov An-2R SP-WON
6 18-JAN-1986 SE-210 Caravelle VI-N HC-BAE
operator fat. location
1 Tselinny gorno-khimicheski kombinat 0 near Shantobe
2 Borealis Exploration 0 Caribou Horn...
3 Air BG 2 near Vatry/Châlon...
4 Indian Airlines 0 Tiruchirappa...
5 ZUA NA Un-Sara
6 SAETA, op.for Aerovias Guatemala 94 near Flores-Santa...
Var.7 pic cat
1 NA NA A1
2 NA NA A2
3 NA NA A1
4 NA NA A2
5 NA NA A1
6 NA NA A1
другой метод
library(rvest)
aviationurl = "https://aviation-safety.net/database/dblist.php?
Year=1986"
webpage = read_html(aviationurl)
# define variables of interest
variables =c("Date","Type","Registration","Operator","Fat","Location","Flag","Picture","Category")
# create sequence of numbers (as CSS for each variable contains a number)
colnums = seq(1,length(variables))
library(dplyr)
table <- list()
for(i in 1:length(colnums)){
table[[i]] <- as.data.frame(html_text(html_nodes(webpage, paste0("td:nth-child(",colnums[i],")"))))
}
table <- bind_cols(table)
names(table) <- variables
head(table)
Date Type Registration
1 03-JAN-1986 Antonov An-2T CCCP-06101
2 13-JAN-1986 BN-2A-6 Islander C-GTPB
3 15-JAN-1986 Dassault Falcon 10 F-GBTC
4 15-JAN-1986 Boeing 737-2A8 Advanced VT-EGD
5 16-JAN-1986 Antonov An-2R SP-WON
6 18-JAN-1986 SE-210 Caravelle VI-N HC-BAE
Operator Fat Location Flag
1 Tselinny gorno-khimicheski kombinat 0 near Shantobe
2 Borealis Exploration 0 Caribou Horn...
3 Air BG 2 near Vatry/Châlon...
4 Indian Airlines 0 Tiruchirappa...
5 ZUA Un-Sara
6 SAETA, op.for Aerovias Guatemala 94 near Flores-Santa...
Picture Category
1 A1
2 A2
3 A1
4 A2
5 A1
6 A1
Для полноты: используйте код, чтобы очистить три страницы с данными на веб-сайте и связать их в один фрейм данных.
library(rvest)
url <- "https://aviation-safety.net/database/dblist.php?Year=1986&. lang=&page="
urls <- paste0(url, 1:3)
scr <- function(url) {
read_html(url) %>%
html_nodes("table") %>%
html_table() %>%
as.data.frame()
}
df <- do.call(rbind, lapply(urls, scr))