【问题标题】:RSelenium: clicking a link within another linkRSelenium:单击另一个链接中的链接
【发布时间】:2019-03-22 17:12:59
【问题描述】:

我有这个RSelenium 脚本:

library(tidyverse)
library(RSelenium) # running through docker
library(rvest)
library(httr)

remDr <- remoteDriver(port = 4445L, browserName = "chrome")
remDr$open()


remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")

books$sendKeysToElement(list("NHL teams", key = "enter"))

bookElem <- remDr$findElements(using = "xpath",
                               "//h3[@class = 'LC20lb']//parent::a")

links <- sapply(bookElem, function(bookElem){
  bookElem$getElementAttribute("href")
})

以上点击谷歌搜索返回的每个链接(每页有 10 个)。我搜索的书籍大多在您点击后都有预览。如果有预览,则有一个小的About this book 链接可供单击,可将您带到发布信息。

我想点击第一个链接,然后如果有预览,请点击“关于这本书”。我有以下内容,但我只收到Error: object of type 'closure' is not subsettable 错误:

for(link in links) {

  # Navigate to each link
  remDr$navigate(link)

  # If statement to get past book previews
  if (str_detect(link, "frontcover")) {

   link2 <- remDr$findElement(using = 'xpath', 
                               '//*[@id="sidebar-atblink"]//parent::a')
   link2 <- as.list(link2)
   print(class(link2))
   link2_about <- sapply(link2, function(ugh){
      ugh$getElementAttribute('href')
    })

  } else {
    print("nice going, dumbass")
  }
}

或者我尝试使用for 循环而不是sapply,我得到Error: $ operator is invalid for atomic vectors

for(link in links) {

  # Navigate to each link
  remDr$navigate(link)

  # If statement to get past book previews
  if (str_detect(link, "frontcover")) {

    link2 <- remDr$findElement(using = 'xpath',
       '//a[@id="sidebar-atb-link" and span[.="About this book"]]')

     for(i in length(link2)){
      i$getElementAttribute('href')
     }

    } else {
     print("dumbass")
   }
}

如何才能成功点击第二个链接,具体取决于预览是否存在?谢谢!

【问题讨论】:

    标签: r selenium web-scraping dplyr rselenium


    【解决方案1】:

    只需更新以下行。

    aboutLinks <- remDr$findElements(using = 'xpath', 
                               '//a[@id="sidebar-atb-link" and span[.="About this book"]]')
    links2 <- sapply(aboutLinks, function(about_link){
      about_link$getElementAttribute('href')
    })
    

    【讨论】:

    • 不幸的是,仍然会遇到令人困惑的Error: object of type 'closure' is not subsettable 错误。一定与下面的sapply 函数有关吗?如,您的元素绝对正确,但之后的某些内容不起作用
    • link2 &lt;- as.list(link2) 你为什么要这样做?
    • 我在某处读到了可能给我这个错误的地方……但谁知道呢。两种方式都出现同样的错误
    • 完成 - 同样的错误。可能是我的机器?不过,如果我注释掉sapply 部分和print(link2),它会打印出正确数量的链接。只是 sapply 会引发子集错误
    • 好的,解决了这个问题。我们错过了s' while getting the 关于这本书的链接。我们应该将元素传递给sapply,而不是元素。
    猜你喜欢
    • 2016-11-28
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多