运行 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…
所以我有一个 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…