使用rvest提交R网页表单遇报错:需填写起止日期
解决Rvest表单提交失败的问题
嘿,我看了你的代码,发现几个关键问题导致表单没提交成功,咱们一步步来梳理解决:
1. 核心缺失:你没执行表单提交操作
你现在的代码只完成了表单字段的填充,但根本没把填充好的表单发送给服务器!这是最致命的遗漏——就像你填好了表单但没点“提交”按钮一样,服务器当然不知道你要请求数据啦。
2. 多余字段可能干扰验证
你手动设置的availableEffectiveDate和availableExpiryDate大概率是页面自动生成的隐藏字段,这些值通常是由页面JS在加载时生成的,不需要你手动赋值。强行设置这些字段反而可能触发服务器的验证逻辑,导致报错。建议直接去掉这两个字段的赋值,只保留必填的startDate、endDate和fileFormat。
3. 修正后的完整可运行代码
这里是调整后的代码,你可以直接测试:
rm(list = ls()) library(rvest) # 初始化会话,保持cookie等会话信息 url <- "http://itc.aeso.ca/itc/public/queryHistoricalIntertieReport.do" pgsession <- html_session(url) # 获取页面上的第一个表单(如果页面有多个表单,你可能需要调整索引) pgform <- html_form(pgsession)[[1]] # 只填充必填字段,去掉自动生成的日期字段 filled_form <- set_values( pgform, fileFormat = "CSV", startDate = "2018-05-01", endDate = "2018-05-02" ) # 关键一步:提交填充好的表单!这里的submit参数要对应表单提交按钮的name属性 submitted_session <- submit_form(pgsession, filled_form, submit = "submit") # 处理返回的CSV数据:如果服务器直接返回CSV内容,用下面的代码读取 csv_content <- read.csv(text = rawToChar(submitted_session$response$content)) # 如果返回的是带下载链接的页面,就先提取链接再下载: # download_link <- html_nodes(submitted_session, "a[href]") %>% # html_attr("href") %>% # grep("\\.csv", ., value = TRUE) # download.file(paste0("http://itc.aeso.ca", download_link), "your_data.csv")
4. 额外注意点
- 确认提交按钮的名称:你可以先运行
print(pgform)查看表单的所有字段,找到提交按钮的name属性(比如可能是submit、download或者其他),确保submit_form()里的submit参数和它一致。 - 检查日期格式:确保
startDate和endDate的格式和页面要求完全匹配(页面提示是日期,YYYY-MM-DD应该没问题,但如果还是报错,可以试试加上时间,比如2018-05-01 00:00:00)。 - 会话一致性:
html_session会自动保存会话信息(比如cookie),不要中途重新初始化会话,否则会丢失验证状态。
如果还是有问题,你可以把print(pgform)的结果贴出来,我帮你进一步排查字段名称的问题~
内容的提问来源于stack exchange,提问作者imgschatz
相关产品推荐
相关产品推荐

