Rvest刮错误

时间:2014-12-05 16:58:55

标签: r web-scraping rvest

这是我正在运行的代码

library(rvest)

rootUri <- "https://github.com/rails/rails/pull/"
PR <- as.list(c(100, 200, 300))
list <- paste0(rootUri, PR)
messages <- lapply(list, function(l) {
  html(l)
})

直到这一点它似乎工作正常,但当我尝试提取文本时:

html_text(messages)

我明白了:

Error in xml_apply(x, XML::xmlValue, ..., .type = character(1)) : 
  Unknown input of class: list

尝试提取特定元素:

html_text(messages[1])

也不能这样做......

Error in xml_apply(x, XML::xmlValue, ..., .type = character(1)) : 
  Unknown input of class: list

所以我尝试了另一种方式:

html_text(messages[[1]])

这似乎至少可以获得数据,但仍然没有成功:

Error in UseMethod("xmlValue") : 
  no applicable method for 'xmlValue' applied to an object of class "c('HTMLInternalDocument',     'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument')"

如何从列表中的每个元素中提取文本材料?

2 个答案:

答案 0 :(得分:5)

您的代码存在两个问题。 Look here for examples on how to use the package.

<强> 1。你不能只使用所有功能。

  • html()用于下载内容
  • html_node()用于从下载的页面内容中选择节点
  • html_text()用于从先前选择的节点中提取文本

因此,要下载其中一个页面并提取html节点的文本,请使用:

library(rvest)

老派风格:

url          <- "https://github.com/rails/rails/pull/100"
url_content  <- html(url)
url_mainnode <- html_node(url_content, "*")
url_mainnode_text <- html_text(url_mainnode)
url_mainnode_text

......或者......

难以读懂老派风格:

url_mainnode_text  <- html_text(html_node(html("https://github.com/rails/rails/pull/100"), "*"))
url_mainnode_text

......或者......

magritr-piping style

url_mainnode_text  <- 
  html("https://github.com/rails/rails/pull/100") %>%
  html_node("*") %>%
  html_text()
url_mainnode_text

<强> 2。使用列表时,您必须将功能应用于列表,例如: lapply()

如果你想要一些批处理多个网址,你可以尝试这样的事情:

  url_list    <- c("https://github.com/rails/rails/pull/100", 
                   "https://github.com/rails/rails/pull/200", 
                   "https://github.com/rails/rails/pull/300")

  get_html_text <- function(url, css_or_xpath="*"){
      html_text(
        html_node(
          html("https://github.com/rails/rails/pull/100"), css_or_xpath
        )
      )
   }

lapply(url_list, get_html_text, css_or_xpath="a[class=message]")

答案 1 :(得分:1)

您需要使用html_nodes()并确定哪些CSS选择器与您感兴趣的数据相关。例如,如果我们想要提取人们讨论pull 200的用户名

rootUri <- "https://github.com/rails/rails/pull/200"
page<-html(rootUri)
page %>% html_nodes('#discussion_bucket strong a') %>% html_text()

[1] "jaw6"      "jaw6"      "josevalim"