rvest:输入没有名字时如何提交表单?

rvest: how to submit form when input doesn't have a name?

我有一个简单的问题,我不知道如何解决。我想使用 rvest 填写表单,其中输入没有名称:

library(rvest)
session <- html_session("https://www.tripadvisor.com/")
pgform <- html_form(session)[[1]]

> pgform
<form> 'global_nav_search_form' (GET /Search)
  <input search> '': 
  <input text> '': 
  <button submit> 'sub-search
  <input hidden> 'geo': 1
  <input hidden> 'latitude': 
  <input hidden> 'longitude': 
  <input hidden> 'searchNearby': 
  <input hidden> 'pid': 3826
  <input hidden> 'redirect': 
  <input hidden> 'startTime': 
  <input hidden> 'uiOrigin': 
  <input hidden> 'q': 
  <input hidden> 'supportedSearchTypes': find_near_stand_alone_query
  <input hidden> 'enableNearPage': true
  <input hidden> 'returnTo': __2F__
  <input hidden> 'searchSessionId': C9C09F9043AE6FE69CE679DF8A44546D1547136702473ssid
  <input hidden> 'social_typeahead_2018_feature': true

这里我想通过设置输入文本进行搜索,得到页面的link。当然如果我这样做

filledform <- set_values(pgform, '' = "Paris")

我有一个错误:

Error: attempt to use zero-length variable name

我确信有一个简单的解决方法,但我不知道。有什么想法吗?

修改空字段

你可以直接通过字段的索引访问和修改一个空名的字段,例如:

pgform$fields[[2]]$value <- 'Paris'

如果你想根据类型动态查找字段的索引,你可以这样做:

for (i in 1:length(pgform$fields))
    if (is.null(pgform$fields[[i]]$name) && pgform$fields[[i]]$type == 'text')
        pgform$fields[[i]]$value <- 'Paris'

您的具体问题

对于您的特定网站,以上不会给您预期的结果。您需要修改以提交查询的字段是 q,因此您可能希望这样做:

session <- html_session('https://www.tripadvisor.com/')
pgform <- html_form(session)[[1]]
pgform <- set_values(pgform, q = 'Paris')
result <- submit_form(session, pgform)

这将为您加载所需的页面,但不会为您提供您可能正在寻找的内容,因为该内容只能由浏览器使用 XMLHttpRequest 动态加载。要同时获取内容,您需要执行以下操作:

session <- html_session('https://www.tripadvisor.com/')
pgform <- html_form(session)[[1]]
pgform <- set_values(pgform, q = 'Paris')
result <- submit_form(session, pgform, submit = NULL, httr::add_headers('x-requested-with' = 'XMLHttpRequest'))

这将为您提供没有周围页面结构的内容。