使用 RSelenium 中的下拉值抓取 table

Scraping table with drop-down values in RSelenium

Selenium 新手。我正在尝试从这个 table 填充动态数据的结果中抓取结果:

元素如下:

我希望我可以添加 link,但它受密码保护,共享将是一个安全问题。我很难找到与 post 相当的东西作为 suitable 示例,欢迎提出建议。

对于之前的 table(也是基于动态信息,但不是下拉菜单),这段代码对我有用:

# WORKED FOR NON-DROPDOWN DYNAMIC TABLE
require(RSelenium)
pJS <- phantom()
Sys.sleep(5)
remDr <- remoteDriver(browserName = "phantomjs")
remDr$open()
url <- paste0("http://",un,":",pass,"@egauge", meter, ".egaug.es/57A4C/check.html")
remDr$navigate(url)
#remDr$screenshot(display = TRUE)
doc <- htmlParse(remDr$getPageSource()[[1]])
remDr$close()

readHTMLTable(doc)[[2]]

但如果我对当前 table 使用相同的方法,它会返回下拉框中的所有值。我目前的尝试是这样的:

# NON-WORKING ATTEMPT FOR DROPDOWN DYNAMIC TABLE
require(RSelenium)

pJS <- phantom()
Sys.sleep(5)
remDr <- remoteDriver(browserName = "phantomjs")
remDr$open()
url <- paste0("http://",un,":",pass,"@egauge", meter, ".egaug.es/57A4C/settings.html")
remDr$navigate(url)
remDr$findElement("xpath", '//*[@id="regsDiv"]/div/table/tbody/tr[1]/td[3]/span[2]/select[1]')$selectTag()

但这只是 returns 元素、选项和文本的列表。我需要选择的选项。一旦这个工作我循环遍历 tr[](从 xpath)并抓取所有选定的值。

谢谢!任何帮助表示赞赏!抱歉,我没有很好的工作示例。

编辑:已更新响应。

您可以使用isElementSelected方法:

remDr$navigate("http://nhb.gov.in/OnlineClient/MonthlyPriceAndArrivalReport.aspx")
elem <- remDr$findElement(
  using = "id", 
  value = "ctl00_ContentPlaceHolder1_ddlyear"
)
options <- elem$selectTag()
res <- vapply(options$elements, function(x) x$isElementSelected()[[1]], 
              logical(1))
res
> res
[1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[16] FALSE FALSE FALSE

更新: dev 分支现在将选定字段添加到 selectTag 方法:

devtools::install_github("ropensci/RSelenium")

remDr$navigate("http://nhb.gov.in/OnlineClient/MonthlyPriceAndArrivalReport.aspx")
elem <- remDr$findElement(
  using = "id", 
  value = "ctl00_ContentPlaceHolder1_LsboxCenterList"
)
options <- elem$selectTag()
options$selected
> options$selected
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[16] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[31] FALSE FALSE FALSE FALSE

# Now select "AGRA" and BANGALORE
myScript <- 
  "for (var i=0, iLen=arguments.length; i<iLen; i++) {
        arguments[i].selected = true;
        }"
remDr$executeScript(myScript, options$elements[c(2,5)])
newoptions <- elem$selectTag()
newoptions$selected
> newoptions$selected
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[16] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[31] FALSE FALSE FALSE FALSE