代码之家  ›  专栏  ›  技术社区  ›  denis

当输入没有名称时,如何提交表单?

  •  0
  • denis  · 技术社区  · 6 年前

    我有一个简单的问题,我不知道如何解决。我想用 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 回复  |  直到 6 年前
        1
  •  1
  •   martin_joerg    6 年前

    修改空字段

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

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

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