使用 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
表示指向浏览器中主动呈现节点的指针,而不仅仅是要解析的惰性文本字符串。 rvest
和 xml2
包没有关于 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"
我正在尝试从 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
表示指向浏览器中主动呈现节点的指针,而不仅仅是要解析的惰性文本字符串。 rvest
和 xml2
包没有关于 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"