NoSuchElementException使用RSelenium

时间:2016-07-20 11:12:53

标签: css r xpath web-scraping rselenium

我使用R(和RSelenium)从ESPN获取数据。这不是我第一次使用它,但在这种情况下,我收到了错误,我无法解决这个问题。

考虑此页面:http://en.espn.co.uk/premiership-2011-12/rugby/match/142562.html

让我们试着刮掉时间表。如果我检查页面,我会得到css选择器

#liveLeft

像往常一样,我选择

checkForServer()
remDr <- remoteDriver()
remDr$open()

matchId <- "142562"
leagueString <- "premiership"
seasonString <- "2011-12"


url <- paste0("http://en.espn.co.uk/",leagueString,"-",seasonString,"/rugby/match/",matchId,".html")

remDr$navigate(url)

并正确加载页面。到现在为止还挺好。现在,当我尝试使用

获取节点时
div<- remDr$findElement(using = 'css selector','#liveLeft')

我回来了

Error:   Summary: NoSuchElement
     Detail: An element could not be located on the page using the given search parameters.
我很困惑。我也尝试使用Xpath并且不起作用。我也试图获得页面的不同元素,没有运气。唯一能回馈的选择器是

#scrumContent

2 个答案:

答案 0 :(得分:2)

来自评论。

元素位于iframe中,因此元素不可供选择。在jschrome的控制台中使用document.getElementById('liveLeft')时会显示此信息。在整页上,它将返回null,即元素不存在,即使它清晰可见。要解决此问题,只需加载iframe即可。

如果您检查该页面,则会从提供的示例中看到scr的{​​{1}}为iframe。导航到此页面而不是“完整”页面将允许元素“可见”,因此可以选择/premiership-2011-12/rugby/current/match/142562.html?view=scorecard

RSelenium

更新

如果更适用于在变量中加载checkForServer() remDr <- remoteDriver() remDr$open() matchId <- "142562" leagueString <- "premiership" seasonString <- "2011-12" url <- paste0("http://en.espn.co.uk/",leagueString,"-",seasonString,"/rugby/current/match/",matchId,".html?view=scorecard") # Amend url to return iframe remDr$navigate(url) div<- remDr$findElement(using = 'css selector','#liveLeft') 内容然后遍历该变量,则以下示例将显示此内容。

iframe

答案 1 :(得分:1)

一般情况下,当您拥有包含框架/ iframe的网页时,您需要使用switchToFrame类的remoteDriver方法:

library(RSelenium)
selServ <- startServer()
remDr <- remoteDriver()
remDr$open()
matchId <- "142562"
leagueString <- "premiership"
seasonString <- "2011-12"
url <- paste0("http://en.espn.co.uk/",leagueString,"-",seasonString,"/rugby/match/",matchId,".html")
remDr$navigate(url)
# check the iframes
iframes <- htmlParse(remDr$getPageSource()[[1]])["//iframe", fun = function(x){xmlGetAttr(x, "id")}]
# iframes[[3]] == "win_old" contains the data switch to this frame
remDr$switchToFrame(iframes[[3]])
# check you can access the element
div<- remDr$findElement(using = 'css selector','#liveLeft')
div$highlightElement()
# get data
ifSource <- htmlParse(remDr$getPageSource()[[1]])
out <- readHTMLTable(ifSource["//div[@id = 'liveLeft']"][[1]], header = TRUE)