2

调整这个 SO 答案,我正在尝试使用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

我究竟做错了什么?

4

1 回答 1

4

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

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

以及通过以下方式查找提交按钮的submit_form代码调用submit_request

submits <- Filter(function(x) identical(x$type, "submit"), 
    form$fields)

并且由于它检查与“提交”相同的值,它没有找到“提交”

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 测试)

于 2015-05-10T22:30:10.213 回答