r rvest error: "Error in doc_namespaces(doc) : external pointer is not valid"

r rvest error: "Error in doc_namespaces(doc) : external pointer is not valid"

我的问题类似于this one,但后者没有收到我可以处理的答案。我正在使用 xml2::read_html 抓取数千个 url。这很好用。但是,当我尝试使用 purrr::map_dfhtml_nodes 解析生成的 html 文档时,出现以下错误:

Error in doc_namespaces(doc) : external pointer is not valid

出于某种原因,我无法使用示例重现错误。下面的例子不是很好,因为它工作得很好。但是,如果有人可以从概念上向我解释错误的含义以及如何解决它,那就太好了(这里是关于类似问题的 github thread,但我没有遵循所有技术细节)。

library(rvest)
library(purrr)
urls_test <- list("https://en.wikipedia.org/wiki/FC_Barcelona",
             "https://en.wikipedia.org/wiki/Rome")
h <- urls_test %>% map(~{
  Sys.sleep(sample(seq(1, 3, by=0.001), 1))
  read_html(.x)})
out <- h %>% map_df(~{
  a <- html_nodes(., "#firstHeading") %>% html_text()
  a <- if (length(a) == 0) NA else a
  b <- html_nodes(., ".toctext") %>% html_text()
  b <- if (length(b) == 0) NA else b

  df <- tibble(a, b)
})

Session 信息:

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Devuan GNU/Linux ascii

问题是,R 将 xml 存储在带有外部指针的内存中。这些外部指针未存储在 .rds 文件中。因此,一旦您保存项目并重新打开它,您将收到错误 external pointer is not valid.

解决方法: 使用 xml2::write_html() 将解析后的 html 保存到 html 文件中。如果您想稍后使用它,请使用 xml2::read_html()

阅读它

另请参阅更多信息here and for parallel processing here and