1

这是我正在运行的代码

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')"

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

4

2 回答 2

5

您的代码有两个问题。在此处查看有关如何使用该软件包的示例。

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

... 或这个 ...

磁管式

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

2.使用列表时,您必须将函数应用于列表,例如lapply()

如果您想对多个 URL 进行批处理,可以尝试以下操作:

  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]")
于 2014-12-05T19:17:50.247 回答
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"
于 2014-12-05T19:07:04.113 回答