尝试使用 Rvest 提交表单时出错

Error when attempting to submit form with Rvest

适配 ,我正在尝试使用 rvest 生成一个表单来抓取生成的页面。我一直想出一个错误。

library(rvest)


url <- "https://iemweb.biz.uiowa.edu/pricehistory/pricehistory_SelectContract.cfm?market_ID=214"

pg.session <- html_session(url)

pg.form <- html_form(html(pg.session))

filled_form <- set_values(pg.form[[1]],
                      Month = "8",
                      Year = "1")

out <- submit_form(session = pg.session, pg.form)

returns 这个错误

Submitting with ''
Error in if (!(submit %in% names(submits))) { : 
 argument is of length zero

我做错了什么?

嗯,一方面,您没有提交实际填写的表格,而且您还试图传递表格列表而不是表格,但代码中似乎也可能存在错误无法识别带有大写标签的提交按钮。在这种情况下,HTML 的代码为

<INPUT TYPE="SUBMIT" VALUE="Get Prices">

submit_form 代码调用 submit_request 通过

查找提交按钮
submits <- Filter(function(x) identical(x$type, "submit"), 
    form$fields)

并且因为它检查与 "submit" 相同的值,所以没有找到 "SUBMIT"

sapply(pg.form[[1]]$fields, function(x) x$type)
# $Market_ID
# [1] "HIDDEN"
# $Month
# NULL
# $Year
# NULL
# $`NULL`
# [1] "SUBMIT"

最简单的可能是自己改

filled_form <- set_values(pg.form[[1]],
                      Month = "08",
                      Year = "2007")
filled_form$fields[[4]]$type <- "submit"

另一个问题是这个版本在 URL 我们解决表单的方式上有一个错误。我们可以用

修复它
# incorrectly was: url <- XML::getRelativeURL(session$url, form$url)
body(submit_form)[[3]]<-quote(url <- XML::getRelativeURL(form$url, session$url))

现在终于可以提交请求了

out <- submit_form(session = pg.session, filled_form)
# out %>% html_table()

(使用 rvest_0.2.0.9000 测试)