使用 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
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