因此,我有从本地政府机构的“新闻档案”中抓取的新闻文章URL的列表/ df,总共约5000个。我编写了以下函数,使用rvest抓取了文章的标题,正文和日期,现在将在下面进行介绍:
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列表上运行这些函数,然后为每篇文章的标题,文本和日期创建单独的列表,然后将它们组合成小标题或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…