Запуск функции разбора html по списку URL в R - PullRequest
0 голосов
/ 21 марта 2020

Итак, у меня есть список / df URL-адресов новостных статей, которые я вычеркнул из «архивов новостей» местного органа власти - всего около 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-адресов, чтобы затем создать отдельные списки заголовка, текста и даты каждой статьи, которые затем могут быть объединены в 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

Большое спасибо заранее!

1 Ответ

0 голосов
/ 21 марта 2020

Вы можете экспортировать результаты своих трех функций в виде списка и использовать 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…
...