我有一个简单的问题,我不知道如何解决。我想使用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
我确定有一个简单的解决方法,但是我不知道。有什么想法吗?
答案 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'))
这将为您提供没有周围页面结构的内容。