Как получить доступ к странице, очищенной с помощью RSelenium с помощью rvest?

Я пытаюсь почистить веб-страницу, которая использует angular.js. Насколько я понимаю, единственный вариант в R - это использовать RSelenium для загрузки страницы, а затем анализировать содержимое. Тем не менее, я нахожу rvest более интуитивно понятен, чем RSelenium, для анализа содержимого, поэтому я хотел бы поработать как можно меньше с RSelenium, а затем переключиться на rvest как только я могу.

До сих пор я понял, что, вероятно, мне нужно, по крайней мере, использовать RSelenium для подключения и загрузки HTML-кода, используя htmlTreeParse, Предположим, это часть моего вывода:

structure(list(name = "div", attributes = structure(c("im_dialog_date", 
"dialogMessage.dateText"), .Names = c("class", "ng-bind")), children = structure(list(
    text = structure(list(name = "text", attributes = NULL, children = NULL, 
        namespace = NULL, namespaceDefinitions = NULL, value = "6:52 PM"), .Names = c("name", 
    "attributes", "children", "namespace", "namespaceDefinitions", 
    "value"), class = c("XMLTextNode", "XMLNode", "RXMLAbstractNode", 
    "XMLAbstractNode", "oldClass"))), .Names = "text"), namespace = NULL, 
    namespaceDefinitions = NULL), .Names = c("name", "attributes", 
"children", "namespace", "namespaceDefinitions"), class = c("XMLNode", 
"RXMLAbstractNode", "XMLAbstractNode", "oldClass"))

Как я могу передать это rvest::read_html()?

1 ответ

Решение

Если вы посмотрите на класс вашего предмета, это XMLNode, который является классом, определяемым XML пакет. В нем он определяет метод для toString (но нет as.character(что любопытно), что позволяет преобразовать узел в обычную строку, которая в свою очередь может быть прочитана xml2::read_html:

library(rvest)
#> Loading required package: xml2

node <- structure(list(name = "div", attributes = structure(c("im_dialog_date", 
"dialogMessage.dateText"), .Names = c("class", "ng-bind")), children = structure(list(
    text = structure(list(name = "text", attributes = NULL, children = NULL, 
        namespace = NULL, namespaceDefinitions = NULL, value = "6:52 PM"), .Names = c("name", 
    "attributes", "children", "namespace", "namespaceDefinitions", 
    "value"), class = c("XMLTextNode", "XMLNode", "RXMLAbstractNode", 
    "XMLAbstractNode", "oldClass"))), .Names = "text"), namespace = NULL, 
    namespaceDefinitions = NULL), .Names = c("name", "attributes", 
"children", "namespace", "namespaceDefinitions"), class = c("XMLNode", 
"RXMLAbstractNode", "XMLAbstractNode", "oldClass"))

node %>% XML::toString.XMLNode() %>% read_html()
#> {xml_document}
#> <html>
#> [1] <body><div class="im_dialog_date" ng-bind="dialogMessage.dateText">6 ...

Тем не менее, я обычно просто использую RSelenium::remoteDriver"s getPageSource() способ просто захватить весь HTML, который затем легко анализируется с помощью rvest.

Другие вопросы по тегам