2

この 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

私は何を間違っていますか?

4

1 に答える 1

4

1 つには、実際に入力したフォームを送信しておらず、フォームではなくフォームのリストを渡そうとしていますが、認識しないコードにバグがある可能性もあります。大文字のタグが付いた送信ボタン。この場合、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"

もう 1 つの問題は、このバージョンには解決したフォームの 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 に答える