我正在尝试使用rvest下载[完整的]动态扩展的[馆藏]表,但是遇到Unknown field names
错误。
s <- html_session("http://innovatoretfs.com/etf/?ticker=ffty")
f <- html_form(s)[[1]]
#the following line fails:
f.new <- set_values(f, `__EVENTTARGET` = "ctl00$BodyPlaceHolder$ViewHoldingsLinkButton")
##subsequent lines are not tested##
doc <- submit_form(s, f.new)
tabs <- xml_find_all(doc, "//table")
holdings <- html_table(tabs, fill = T, trim = T)[[5]]
我对HTML / HTTP不太满意,但从我可以理解的角度来看,要扩展表格,需要使用具有此新字段值集的表单回发
在检查set_values
函数之后,似乎只允许为现有字段分配值。
是否可以在rvest
下的表单中添加新字段?如果没有,有人知道我可以使用另一个软件包来获得此功能吗?
[编辑]非常明确,我需要动态扩展表的完整版本并添加预期的后续表提取代码
答案 0 :(得分:1)
可解决,但可以解决,但会将问题提交给项目,以对add_values类型功能进行适当的修复
getInnovatorHoldings <- function() {
s <- html_session("http://innovatoretfs.com/etf/?ticker=ffty")
f <- html_form(s)[[1]]
f.new <- add_values(f,
`__EVENTTARGET` = "ctl00$BodyPlaceHolder$ViewHoldingsLinkButton",
`__EVENTARGUMENT` = "",
`submit` = NULL)
s <- submit_form(s, f.new, "submit")
doc <- read_html(s)
tabs <- xml_find_all(doc, "//table")
holdings <- html_table(tabs, fill = T, trim = T)[[5]]
return(holdings)
}
add_values <- function(form, ...) {
new_values <- list(...)
no_match <- which(!names(new_values) %in% names(form$fields))
for (n in no_match) {
if (names(new_values[n]) == "submit") {
form$fields[[names(new_values[n])]] <- new_input(name = names(new_values[n]), type = "submit", value = NULL)
} else {
form$fields[[names(new_values[n])]] <- new_input(name = names(new_values[n]), type = "hidden", value = new_values[n][[1]])
}
}
return(form)
}
new_input <- function(name, type, value, checked = NULL, disabled = NULL, readonly = NULL, required = F) {
return(
structure(
list(name = name,
type = type,
value = value,
checked = checked,
disabled = disabled,
readonly = readonly,
required = required
),
class = "input"
)
)
}
答案 1 :(得分:0)
答案:rvest
此解决方案有效,但仅返回表的前10行:
library(tidyverse)
library(rvest)
ffty_url <- "http://innovatoretfs.com/etf/?ticker=ffty"
ffty_table <- ffty_url %>%
read_html %>%
html_table(fill = T) %>%
.[[5]]
正在努力获取完整表,但是使用rvest
可能无法实现,因为它是可扩展的。老实说不确定。
答案:RSelenium
您将必须安装RSelenium
和docker,并且上面有多个教程。 但是下面的代码也只返回前十行,这让我很生气。
library(RSelenium)
library(rvest)
remDr <- remoteDriver(port = 4445L, remoteServerAddr = "localhost",
browserName = "chrome")
remDr$open()
remDr$navigate("http://innovatoretfs.com/etf/?ticker=ffty")
page <- read_html(remDr$getPageSource()[[1]])
table <- html_table(page, fill = TRUE, header = T)
table[[5]]
如果任何人想扩展任一组代码,请...