无法保存 - 从R中的rvest生成的xml_document

时间:2016-06-08 13:18:50

标签: r xml rvest

read_html函数生成一个我想保存的xml_document,稍后加载它来解析它。

问题是加载xml_document后,其中没有html。

library(rvest)
library(magrittr)
doc <- read_html("http://www.example.com/")
doc %>% html_node("h1") %>% html_text

我得到:[1] "Example Domain"

但是当我首先保存xml_document doc对象并再次加载它时,似乎所有内容都已被清除。

save(doc, file=paste0(getwd(), "/example.RData"))
rm(doc)

load(file=paste0(getwd(), "/example.RData"))
doc %>% html_node("h1") %>% html_text

我得到:Error: No matches

或者当我运行doc时,我得到:{xml_document}一个空的xml_document。

当我运行doc时,在加载它之后,我收到一条消息,表明RStudio已停止工作。

我在两台不同的Windows机器上试过它,遇到了同样的问题。

sessionInfo()

R version 3.3.0 (2016-05-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] magrittr_1.5     rvest_0.3.1.9000 xml2_0.1.2      

loaded via a namespace (and not attached):
[1] httr_1.1.0  R6_2.1.2    tools_3.3.0 Rcpp_0.12.5

3 个答案:

答案 0 :(得分:4)

我找到了一种解决方法,但效率不高,但确实有效。

逻辑是将xml_document保存为字符串,然后使用read_html再次阅读。

library(rvest)
library(magrittr)
doc <- read_html("http://www.example.com/")

# convert it to character
doc %<>% as("character")

save(doc, file=paste0(getwd(), "/example.RData"))
rm(doc)

load(file=paste0(getwd(), "/example.RData"))
doc %>% read_html %>% html_node("h1") %>% html_text

答案 1 :(得分:4)

我写了一些 ad hoc 函数来完成这项任务。它们比上一个答案略好,因为它们适用于 rvest 对象的列表,并且它们使用RDS而不是RData文件。这允许人们根据需要命名对象。

write_rvest = function(x, path, ...) {
  #convert to character
  #is list?
  if (is.list(x)) {
    x %<>% map(as.character)
  } else {
    x %<>% as.character
  }

  #save
  write_rds(x, path = path, ...)
}

read_rvest = function(path) {
  #load from file
  x = read_rds(path)

  #read
  if (is.list(x)) {
    x %<>% map(read_html)
  } else {
    x %<>% read_html
  }

  x
}

测试平等工作但身份失败。然而,对象工作并且它们具有相同的字节大小,所以我不知道为什么身份失败。也许它对RAM位置很敏感。

答案 2 :(得分:1)

这里有与基本R代码中的Deleet相同的包装函数。

library(rvest)

write_rvest = function(x, path, ...) {
  #convert to character
  #is list?
  if (is.list(x)) {
    x = Map(as.character, x)
  } else {
    x = Map(as.character, x)
  }

  #save
  saveRDS(x, path = path, ...)
}

read_rvest = function(path) {
  #load from file
  x = readRDS(path)

  #read
  if (is.list(x)) {
    x <- Map(read_html, x)
  } else {
    x <- read_html(x)
  }

  x
}