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

问题描述 投票:0回答:1

因此,我有从本地政府机构的“新闻档案”中抓取的新闻文章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

非常感谢您!

html r xml web-scraping supervised-learning
1个回答
0
投票

您可以将三个函数的结果导出为列表,然后使用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…
© www.soinside.com 2019 - 2024. All rights reserved.