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

标签 r web-scraping rvest

适应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/

相关文章:

r - 根据数据集中的列对图中的分面进行排序

python - 简单的 Python 网络爬虫与 BeautifulSoup

r - Dplyr加入: NA match to any

r - 为每个观察添加频率列

java - Jsoup reddit 刮刀 429 错误

python - 抓取以 JSON 形式传递的无限结果 ("View more")

rvest:选择并抓取特定(标题)字符串后的 html 表

html - 如何在 R 中发布一个简单的 HTML 表单?

javascript - rvest 使用 javascript 进行网页抓取

RDCOMClient + Outlook 电子邮件