rvest:如何更改表单中的单选按钮值

rvest: how to change radio button value in a form

我正在使用 rvest 进行一些网络抓取,我正在 tripadvisor 上进行培训。我没有设法将单选按钮设置为正确的值以获得所有评论:

library(rvest)
url <- "https://www.tripadvisor.com/Restaurant_Review-g187438-d12699400-Reviews-Trattoria_Mamma_Franca-Malaga_Costa_del_Sol_Province_of_Malaga_Andalucia.html"
session <- html_session(url)
pgform <- html_form(session)[[3]]

给出了形式

<form> 'taplc_location_review_filter_controls_0_form' (POST /SetReviewFilter#REVIEWS)
  <input checkbox> 'filterRating': 5
  <input checkbox> 'filterRating': 4
  <input checkbox> 'filterRating': 3
  <input checkbox> 'filterRating': 2
  <input checkbox> 'filterRating': 1
  <input hidden> 'filterRating': 
  <input checkbox> 'filterSegment': 3
  <input checkbox> 'filterSegment': 2
  <input checkbox> 'filterSegment': 5
  <input checkbox> 'filterSegment': 1
  <input checkbox> 'filterSegment': 4
  <input hidden> 'filterSegment': 
  <input checkbox> 'filterSeasons': 1
  <input checkbox> 'filterSeasons': 2
  <input checkbox> 'filterSeasons': 3
  <input checkbox> 'filterSeasons': 4
  <input hidden> 'filterSeasons': 
  <input radio> 'filterLang': ALL
  <input radio> 'filterLang': en
  <input radio> 'filterLang': es
  <input radio> 'filterLang': it
  <input radio> 'filterLang': fr
  <input radio> 'filterLang': nl
  <input radio> 'filterLang': ru
  <input radio> 'filterLang': sv
  <input radio> 'filterLang': da
  <input radio> 'filterLang': de
  <input radio> 'filterLang': no
  <input radio> 'filterLang': pl
  <input radio> 'filterLang': pt
  <input hidden> 'returnTo': #REVIEWS

我想将 filterLang 设置为 ALL

filledform <- set_values(pgform,
                         filterLang = "ALL")
submit_form(session,filledform)

给我错误:

Error: Could not find possible submission target.

我应该使用什么提交?我可以使用 rvest,还是应该尝试 之类的东西?

您收到的错误消息与单选按钮无关,而是与您尝试提交的表单缺少 submit 按钮有关,而 rvest 在尝试提交时需要该按钮提交表格。

作为您示例的解决方法,您可以将字段 returnTo 的字段类型更改为 submit 并将其值设置为页面本身的 URL ,就像这样:

pgform$fields[['returnTo']]$type = 'submit'
pgform$fields[['returnTo']]$value = url

然后您可以按预期设置语言选项,例如

filledform <- set_values(pgform, filterLang = 'it')

filledform <- set_values(pgform, filterLang = 'ALL')

应该可以分别将语言过滤器设置为意大利语或所有语言。

与描述的相似,当你做这样的事情时

url <- 'https://www.tripadvisor.com/Restaurant_Review-g187438-d12699400-Reviews-Trattoria_Mamma_Franca-Malaga_Costa_del_Sol_Province_of_Malaga_Andalucia.html'
session <- html_session(url)
pgform <- html_form(session)[[3]]
pgform$fields[['returnTo']]$type = 'submit'
pgform$fields[['returnTo']]$value = url
filledform <- set_values(pgform, filterLang = 'ALL')
result <- submit_form(session, filledform)

您宁愿获取整个页面,而使用以下代码只获取内容

url <- 'https://www.tripadvisor.com/Restaurant_Review-g187438-d12699400-Reviews-Trattoria_Mamma_Franca-Malaga_Costa_del_Sol_Province_of_Malaga_Andalucia.html'
session <- html_session(url)
pgform <- html_form(session)[[3]]
pgform$fields[['returnTo']]$type = 'submit'
pgform$fields[['returnTo']]$value = url
filledform <- set_values(pgform, filterLang = 'ALL')
result <- submit_form(session, filledform, submit = NULL, httr::add_headers('x-requested-with' = 'XMLHttpRequest'))

由于您尝试与一个相当复杂的网站进行交互,该网站大量使用 JavaScript 和 XMLHttpRequest,您最好从 rvest 切换到支持更好的方法对于此类技术,例如 RSelenium.