【问题标题】:How can I POST a simple HTML form in R?如何在 R 中发布一个简单的 HTML 表单?
【发布时间】:2015-02-22 06:00:54
【问题描述】:

我对 R 编程比较陌生,我正在尝试将我在约翰霍普金斯大学数据科学轨道中学到的一些东西付诸实践。具体来说,我想自动化从US Treasury website下载历史债券价格的过程

同时使用 Firefox 和 R,我能够确定美国财政部网站使用一个非常简单的 HTML POST 表单来指定感兴趣报价的单个日期。然后它会返回所有未偿债券的二级市场信息表。

我尝试使用两个不同的 R 包向美国财政部 Web 服务器提交请求,但未成功。野兔是我尝试过的两种方法:

尝试 #1(使用 RCurl):

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
td.html <- postForm(url,
                    submit = "Show Prices",
                    priceDate.year  = 2014,
                    priceDate.month = 12,
                    priceDate.day   = 15,
                   .opts = curlOptions(ssl.verifypeer = FALSE))

这会导致网页被返回并存储在td.html 中,但它只包含来自treasurydirect 服务器的错误消息。我知道服务器正在工作,因为当我通过浏览器提交相同的请求时,我得到了预期的结果。

尝试 #2(使用 rvest):

s <- html_session(url)
f0 <- html_form(s)
f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
test <- submit_form(s, f1)

不幸的是,这种方法甚至不会离开 R 并导致来自 R 的以下错误消息:

Submitting with 'submit'
Error in function (type, msg, asError = TRUE)  : <url> malformed

我似乎不知道如何查看发送到 rvest 的“格式错误”文本,以便尝试诊断问题。

对于解决这个看似简单的任务的任何建议或技巧将不胜感激!

【问题讨论】:

  • 错误信息是什么意思?
  • 来自美国财政部服务器的错误消息非常无用:“发生意外错误。请稍后重试”
  • 普通的 rvest 方法现在可以正常工作,没有错误。

标签: html r post rcurl rvest


【解决方案1】:

嗯,它似乎可以与 httr 库一起使用。

library(httr)

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"

fd <- list(
    submit = "Show Prices",
    priceDate.year  = 2014,
    priceDate.month = 12,
    priceDate.day   = 15
)

resp<-POST(url, body=fd, encode="form")
content(resp)

rvest 库实际上只是 httr 的包装器。看起来它不能很好地解释没有服务器名称的绝对 URL。所以如果你看

f1$url
# [1] /GA-FI/FedInvest/selectSecurityPriceDate.htm

您会看到它只有路径而不是服务器名称。这似乎令人困惑httr。如果你这样做了

f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
f1$url <- url
test <- submit_form(s, f1)

这似乎有效。也许这是一个应该报告给rvest 的错误。 (在rvest_0.1.0 测试)

【讨论】:

  • 太棒了!!!感谢您的快速回复。您的 httr 解决方案效果很好,我得到了我想要的结果。我对 rvest 不够熟悉,因此无法轻松提交错误报告。顺便说一句,您对 rvest 的“修复”是成功的,但我选择使用您的 httr 解决方案,因为它更容易使用结果。
  • @MrFlick 非常感谢!我在另一个登录表单中遇到了同样的问题,您的描述解决了它。我刚刚打开了rvest issue 并引用了这篇 SO 帖子。
【解决方案2】:

我知道这是一个老问题,但添加

style='POST'

postForm 的参数也可以解决问题。

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多