使用 R Selenium 的动态站点

Dynamic site using R Selenium

我正在尝试从 SEC Edgar 数据库中抓取一些财务报告:https://www.sec.gov/oiea/Article/edgarguide.html

由于它是动态的,我在 Firefox 上使用 R Selenium,现在我有点卡住了。 Firefox 已打开,我已导航到正确的页面。

我要的是总资产。

    remDr$navigate("https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000001800&type=10-K&dateb=&owner=include&count=40&search_text=")
    webElem1 <- remDr$findElement(using = 'css selector', value = "#interactiveDataBtn")
    webElem1$sendKeysToElement(list("\uE007"))
    webElem2 <- remDr$findElement(using = 'css selector', value = "#menu_cat3")
    webElem2$sendKeysToElement(list("\uE007"))
    webElem3 <- remDr$findElement(using = 'css selector', value = "#r6 .xbrlviewer")
    webElem3$sendKeysToElement(list("\uE007"))
    webElem4 <- remDr$findElement(using = 'css selector', value = "#idp6852922048 > tbody > tr:nth-child(12) > td:nth-child(2)") %>% html_text() %>% as.numeric()

如您所见,我正在尝试混合使用 RSelenium 和 rvest 来检索值,但我得到的只是:

    Error in UseMethod("xml_text") : 
    no applicable method for 'xml_text' applied to an object of class "c('webElement', 
    'remoteDriver', 'errorHandler', 'envRefClass', '.environment', 'refClass', 'environment', 'refObject')"

有什么想法吗?

如果您检查 class(webElem4),您会发现它(毫不奇怪)是 class webElement 的一个对象。这是一个特殊的 S4 class,定义了自己的方法。您将它传递给 html_text,就好像它是一个 html_node,如 xml2(或 rvest)中所定义。

虽然两者看起来很相似,但 webElement 表示指向浏览器中主动呈现节点的指针,而不仅仅是要解析的惰性文本字符串。 rvestxml2 包没有关于 webElement 是什么或如何阅读它的概念。

幸运的是,他们不需要。 webElement class 有自己的方法从关联元素中提取文本。因此,在您的情况下(使用 Chrome 而不是 Firefox 的完整示例):

library(RSelenium)
remDr <- rsDriver(port = 4567L, chromever = "84.0.4147.30")$client
remDr$navigate("https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000001800&type=10-K&dateb=&owner=include&count=40&search_text=")
webElem1 <- remDr$findElement(using = 'css selector', value = "#interactiveDataBtn")
webElem1$sendKeysToElement(list("\uE007"))
webElem2 <- remDr$findElement(using = 'css selector', value = "#menu_cat3")
webElem2$sendKeysToElement(list("\uE007"))
webElem3 <- remDr$findElement(using = 'css selector', value = "#r6 .xbrlviewer")
webElem3$sendKeysToElement(list("\uE007"))
webElem4 <- remDr$findElement(using = 'css selector', value = "#idp6852922048 > tbody > tr:nth-child(12) > td:nth-child(2)") 
result <- webElem4$getElementText()[[1]]

result
#> [1] "15,667"