RVEST:输入不带名称时如何提交表格?

时间:2019-01-10 16:17:16

标签: r web-scraping rvest

我有一个简单的问题,我不知道如何解决。我想使用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

在这里,我想通过设置输入文本来进行搜索,以获取页面的链接。当然可以了

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

我有一个错误:

Error: attempt to use zero-length variable name

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

1 个答案:

答案 0 :(得分:1)

修改空白字段

您可以使用字段的索引直接访问和修改具有空名称的字段,例如:

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'))

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