此代码的第一部分(最多为" pages")成功检索了我想要抓取的页面。然后,我努力寻找一种方法来提取文章文本,并将相关日期作为数据框提取。
我明白了:
UseMethod中的错误(" read_xml"): 没有适用于' read_xml'的方法应用于课程" c的对象(' xml_document',' xml_node')"
任何关于优雅,清晰和效率的指导也欢迎,因为这是个人学习。
library(rvest)
library(tidyverse)
library(plyr)
library(stringr)
llply(1:2, function(i) {
read_html(str_c("http://www.thetimes.co.uk/search?p=", i, "&q=tech")) %>%
html_nodes(".Headline--regular a") %>%
html_attr("href") %>%
url_absolute("http://www.thetimes.co.uk")
}) -> links
pages <- links %>% unlist() %>% map(read_html)
map_df(pages, function(x) {
text = read_html(x) %>%
html_nodes(".Article-content p") %>%
html_text() %>%
str_extract(".+skills.+")
date = read_html(x) %>%
html_nodes(".Dateline") %>%
html_text()
}) -> article_df
答案 0 :(得分:0)
很好,你快到了!这里有两个错误:
变量pages
已包含已解析的html代码。因此,在单个页面上(即read_html
内)再次应用map_df
不起作用。这是您收到的错误消息。
map_df中的函数不正确。由于没有显式返回,因此返回最后一个计算值,即date
。变量text
完全被遗忘。您必须将这两个变量打包在数据框中。
以下内容包含固定代码。
article_df <- map_df(pages, function(x) {
data_frame(
text = x %>%
html_nodes(".Article-content p") %>%
html_text() %>%
str_extract(".+skills.+"),
date = x %>%
html_nodes(".Dateline") %>%
html_text()
)
})
还有一些关于代码本身的评论:
<-
代替->
。通过这种方式,可以更轻松地找到变量的分配位置,如果使用“说出变量名称”,则更容易理解代码。purrr
而不是plyr
。 purrr
是tidyverse
包的一部分。因此,您可以简单地使用llply
代替函数map
。 purrr
与plyr
之间有nice article。的
links <- map(1:2, function(i) {
read_html(str_c("http://www.thetimes.co.uk/search?p=", i, "&q=tech")) %>%
html_nodes(".Headline--regular a") %>%
html_attr("href") %>%
url_absolute("http://www.thetimes.co.uk")
})