适应this SO answer ,我尝试使用 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)
返回此错误
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 测试)
关于r - 尝试使用 Rvest 提交表单时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157111/