UP | HOME |

El santoral de El centón de un enano con R

Santoral español

En R existen diversos paquetes que permiten recopilar información de páginas publicadas en la internet. Cada uno de ellos se encarga de una tarea específica, como por ejemplo:

  • Descargar una página web con el paquete httr.
  • Extraer las partes relevantes con el paquete rvest.
  • Procesar las cadenas de texto con el paquete stringr.
  • Guardar la información con el paquete data.table.

Bajo licencia CC BY-NC-ND Santopedia publica el santoral español. Usaremos dicha página como ejemplo de aplicación de los paquetes anteriormente descritos.

Referencia

Código

Código fuente R.

library(httr)
library(rvest)
library(stringr)
library(data.table)

Download the source

url <- "https://www.santopedia.com/santoral"
file <- tempfile() # temporal file
GET(url,write_disk(file)) # get the url and save it

Extract the relevant part

body_text <- read_html(file) %>%
    html_nodes("#content") %>%
    html_text()

Now, the boring steps… Split by months

pormeses <- strsplit(body_text,"Santoral de")[[1]][-1]

Split by days

pormesesdias <- lapply(1:12,function(i){
    mes <- pormeses[[i]]
    print(i)
    print(mes)
    mes <- str_replace(mes,"[:alpha:]+\n[ 1]+\n","1|")
    mes <- str_replace_all(mes, " y otros\\.\\.\\.","")
    mes <- str_replace_all(mes, "\n\n","\n")
    mes <- str_replace_all(mes, "\n([ 0-9]+)\n","\n\\1|")
    print(mes)
    dt <- fread(text=mes,sep="|")
    dt$mes <- i
    dt
})

Collect them

santoral <- rbindlist(pormesesdias)
colnames(santoral) <- c("dia","santos","mes")
santoral <- santoral[,.(mes,dia,santos)]
santoral[,mesdia:=paste0(sprintf("%02d", mes),"-",sprintf("%02d", santoral$dia))]
santoral # Alleluia!

Put the results in this directory

graphdirectory <- "graphics"
dir.create(graphdirectory, showWarnings = FALSE)
fwrite(santoral,file.path(graphdirectory,"santoral.csv"))

Write it a la emacs-lisp

stringelisp <- paste0("(",paste0(paste0("(\"",santoral$mesdia,"\" . \"",santoral$santos,"\")"),collapse="\n"),")")
cat("\n\n\n")
cat(stringelisp,sep="\n\n")
cat("\n\n\n")