运行 html R 中 URL 列表的解析函数

Running html parsing function over a list of URLs in R

所以我有一个 list/df 的新闻文章 URL,它们是我从当地政府机构的 'news archives' 中抓取的 - 总共大约 5000 个。我已经编写了以下功能,使用 rvest 来抓取标题、body 和文章的发布日期,现在我将在下面包括:

get_title <- function(url){

  html <- read_html(url)

  html %>%
    rvest::html_nodes('body') %>% 
    xml2::xml_find_first("//div[contains(@class, 'page-header col-xs-12')]") %>% 
    rvest::html_text()
}

get_text <- function(html){
  html %>% 
    rvest::html_nodes('body') %>% 
    xml2::xml_find_all("//div[contains(@class, 'col-xs-12 text-content')]") %>% 
    rvest::html_text()
}

get_date <- function(text){
  substr(text, 14, 21)
}

我已经测试了这些功能,它们对单个 URL 工作正常,示例如下:

url <- "https://www.rm.dk/om-os/aktuelt/nyheder/nyheder-2020/marts-20/aflysninger-pa-hospitalerne--tjek-din-e-boks-eller-postkasse/"

我觉得自己像个白痴,但我已经尝试了所有我能想到的方法 运行 我的 URL 列表上的函数,然后为每篇文章创建单独的标题、文本和日期列表,然后可以将其组合成 tibble 或 df,这样我就有了用于朴素贝叶斯内容 (SML) 分析的正确数据。如果有人对如何执行此操作有建议,我将非常感激。我试过了,例如:

df_of_urls <- df_of_urls %>% mutate(title = get_title(df_of_urls$x))

get_title(list_of_urls)

我的 URL 数据框如下所示:

URL 列表1

在此先感谢您!

您可以将三个函数的结果导出为列表并使用 dplyr::bind_rows 将它们组合成一个小标题:

library(rvest)
library(dplyr)

# example url list:
url1 <- "https://www.rm.dk/om-os/aktuelt/nyheder/nyheder-2020/marts-20/aflysninger-pa-hospitalerne--tjek-din-e-boks-eller-postkasse/"
url2 <- "https://www.rm.dk/om-os/aktuelt/nyheder/nyheder-2020/marts-20/guider-hjalper-ved-hospitalets-indgange/"
urls <- list(url1, url2)

get_data <- function(url){    
    html <- read_html(url)    
    title <- html %>%
        rvest::html_nodes('body') %>% 
        xml2::xml_find_first("//div[contains(@class, 'page-header col-xs-12')]") %>% 
        rvest::html_text()
    text <- html %>% 
        rvest::html_nodes('body') %>% 
        xml2::xml_find_all("//div[contains(@class, 'col-xs-12 text-content')]") %>% 
        rvest::html_text()
    date <-  substr(text, 14, 21)
    return(list(title=title, text=text, date=date))
}

res <- lapply(urls, get_data) %>% bind_rows()
res
#> # A tibble: 2 x 3
#>   title                               text                                date  
#>   <chr>                               <chr>                               <chr> 
#> 1 "\n                \n             … "\n            19.03.20\nGrundet s… 19.03…
#> 2 "\n                \n             … "\n            19.03.2020\nFor at … 19.03…