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'))
这将为您提供没有周围页面结构的内容。
我有一个简单的问题,我不知道如何解决。我想使用 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'))
这将为您提供没有周围页面结构的内容。