RSelenium 中的 If 语句
If-statement in RSelenium
我有大量化学品需要提取 CAS 编号。我写了一个按预期工作的 for
循环。但是,当在网站上找不到化学名称时,我的代码显然停止了。
有没有办法在 for 循环中解决这个问题?这样当找不到搜索查询时,循环会返回到起始页并搜索列表中的下一项?
下面是我的 for
循环代码,其中包含要搜索的简短名称列表:
library(RSelenium)
library(netstat)
# start the server
rs_driver_object <- rsDriver(browser = "firefox",
verbose = FALSE,
port = 4847L) # change number if port is not open
# create a client object
remDrCh <- rs_driver_object$client
items <- c("MCPA", "DEET", "apple")
numbers <- list()
for (i in items) {
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
search_box <- remDrCh$findElement(using = 'class', 'search-input')
search_box$sendKeysToElement(list(paste(i), key = 'enter'))
Sys.sleep(2)
result <- remDrCh$findElement(using = "class", "result-content")
result$clickElement()
Sys.sleep(2)
cas <- remDrCh$findElements(using = 'class', 'cas-registry-number')
cas_n <- lapply(cas, function (x) x$getElementText())
numbers[[i]] <- unlist(cas_n)
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
Sys.sleep(2)
}
问题出在result <- remDrCh$findElement(using = "class", "result-content")
部分。对于“apple”没有结果,因此没有 R 可以使用的元素。
我试图为该特定部分编写一个单独的 if else
参数,但无济于事。
这仍然只适用于产生结果的查询。我也尝试使用 findElements
但这只对找不到结果的情况有帮助。
result <- remDrCh$findElement(using = "class", "result-content")
if (length(result) > 0) {
result$clickElement()
} else {
remDrCh$navigate("https://commonchemistry.cas.org/")
}
我也尝试过使用这个 但我无法在我的示例中使用它。
如有任何帮助,我们将不胜感激!
这应该有效
items <- c("MCPA", "apple", "DEET")
numbers <- list()
for (i in items) {
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
search_box <- remDrCh$findElement(using = 'class', 'search-input')
search_box$sendKeysToElement(list(paste(i), key = 'enter'))
Sys.sleep(2)
result <- try(remDrCh$findElement(using = "class", "result-content"))
if(!inherits(result, "try-error")){
result$clickElement()
Sys.sleep(2)
cas <- remDrCh$findElements(using = 'class', 'cas-registry-number')
cas_n <- lapply(cas, function (x) x$getElementText())
numbers[[i]] <- unlist(cas_n)
}else{
numbers[[i]] <- NA
}
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
Sys.sleep(2)
}
注意问题代码周围的 try()
包装器:
result <- try(remDrCh$findElement(using = "class", "result-content"))
如果有错误,这将捕获错误,但允许循环继续。然后,如果 try
的输出不是 class "try-error"
,则有一个 if
语句试图找到结果,否则,它将 returns 数字作为NA
.
我有大量化学品需要提取 CAS 编号。我写了一个按预期工作的 for
循环。但是,当在网站上找不到化学名称时,我的代码显然停止了。
有没有办法在 for 循环中解决这个问题?这样当找不到搜索查询时,循环会返回到起始页并搜索列表中的下一项?
下面是我的 for
循环代码,其中包含要搜索的简短名称列表:
library(RSelenium)
library(netstat)
# start the server
rs_driver_object <- rsDriver(browser = "firefox",
verbose = FALSE,
port = 4847L) # change number if port is not open
# create a client object
remDrCh <- rs_driver_object$client
items <- c("MCPA", "DEET", "apple")
numbers <- list()
for (i in items) {
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
search_box <- remDrCh$findElement(using = 'class', 'search-input')
search_box$sendKeysToElement(list(paste(i), key = 'enter'))
Sys.sleep(2)
result <- remDrCh$findElement(using = "class", "result-content")
result$clickElement()
Sys.sleep(2)
cas <- remDrCh$findElements(using = 'class', 'cas-registry-number')
cas_n <- lapply(cas, function (x) x$getElementText())
numbers[[i]] <- unlist(cas_n)
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
Sys.sleep(2)
}
问题出在result <- remDrCh$findElement(using = "class", "result-content")
部分。对于“apple”没有结果,因此没有 R 可以使用的元素。
我试图为该特定部分编写一个单独的 if else
参数,但无济于事。
这仍然只适用于产生结果的查询。我也尝试使用 findElements
但这只对找不到结果的情况有帮助。
result <- remDrCh$findElement(using = "class", "result-content")
if (length(result) > 0) {
result$clickElement()
} else {
remDrCh$navigate("https://commonchemistry.cas.org/")
}
我也尝试过使用这个
如有任何帮助,我们将不胜感激!
这应该有效
items <- c("MCPA", "apple", "DEET")
numbers <- list()
for (i in items) {
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
search_box <- remDrCh$findElement(using = 'class', 'search-input')
search_box$sendKeysToElement(list(paste(i), key = 'enter'))
Sys.sleep(2)
result <- try(remDrCh$findElement(using = "class", "result-content"))
if(!inherits(result, "try-error")){
result$clickElement()
Sys.sleep(2)
cas <- remDrCh$findElements(using = 'class', 'cas-registry-number')
cas_n <- lapply(cas, function (x) x$getElementText())
numbers[[i]] <- unlist(cas_n)
}else{
numbers[[i]] <- NA
}
Sys.sleep(2)
remDrCh$navigate("https://commonchemistry.cas.org/")
Sys.sleep(2)
}
注意问题代码周围的 try()
包装器:
result <- try(remDrCh$findElement(using = "class", "result-content"))
如果有错误,这将捕获错误,但允许循环继续。然后,如果 try
的输出不是 class "try-error"
,则有一个 if
语句试图找到结果,否则,它将 returns 数字作为NA
.