从多个网页中提取多个文本

时间:2017-02-06 18:38:16

标签: web-scraping rstudio plyr rvest purrr

此代码的第一部分(最多为" 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

1 个答案:

答案 0 :(得分:0)

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

  1. 变量pages已包含已解析的html代码。因此,在单个页面上(即read_html内)再次应用map_df不起作用。这是您收到的错误消息。

  2. map_df中的函数不正确。由于没有显式返回,因此返回最后一个计算值,即date。变量text完全被遗忘。您必须将这两个变量打包在数据框中。

  3. 以下内容包含固定代码。

    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而不是plyrpurrrtidyverse包的一部分。因此,您可以简单地使用llply代替函数mappurrrplyr之间有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")
    })