0

此代码的第一部分(最多“页面”)成功检索了我要从中抓取的页面。然后,我正在努力寻找一种方法来提取带有相关日期的文章文本片段作为数据框。

我得到:

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
4

1 回答 1

0

太好了,你就快到了!这里有两个错误:

  1. 该变量pages已包含已解析的 html 代码。因此,read_html在单个页面(即 inside map_df)上再次申请是行不通的。这是您收到的错误消息。

  2. 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. purrrtidyverse包装的一部分。因此,llply您可以简单地使用map. 关于vs有一篇不错的文章purrrplyr

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")
})
于 2017-02-07T15:26:59.530 回答