Как получить доступ к странице, очищенной с помощью 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.