这是我正在运行的代码
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')"
如何从列表中的每个元素中提取文本材料?
答案 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"