html - from - spanish encoding r
convertir la codificación de entidades de caracteres HTML en R (3)
¿Hay alguna forma en R para convertir codificaciones de entidades de caracteres HTML?
Me gustaría convertir entidades de caracteres HTML como &
a &
o >
a >
Para Perl existe el paquete HTML: Entidades que podrían hacer eso, pero no pude encontrar algo similar en R.
También probé con iconv()
pero no pude obtener resultados satisfactorios. Quizás también haya una forma de usar el paquete XML
, pero todavía no lo he descubierto.
Si bien la solución de Jeroen hace el trabajo, tiene la desventaja de que no está vectorizada y, por lo tanto, lenta si se aplica a una gran cantidad de caracteres. Además, solo funciona con un vector de caracteres de longitud uno y uno tiene que usar sapply
para un vector de caracteres más largo.
Para demostrar esto, primero creo un vector de caracteres grandes:
set.seed(123)
strings <- c("abcd", "& ' >", "&", "€ <")
many_strings <- sample(strings, 10000, replace = TRUE)
Y aplicar la función:
unescape_html <- function(str) {
xml2::xml_text(xml2::read_html(paste0("<x>", str, "</x>")))
}
system.time(res <- sapply(many_strings, unescape_html, USE.NAMES = FALSE))
## user system elapsed
## 2.327 0.000 2.326
head(res)
## [1] "& '' >" "€ <" "& '' >" "€ <" "€ <" "abcd"
Es mucho más rápido si todas las cadenas en el vector de caracteres se combinan en una sola cadena grande, por lo que read_html()
y xml_text()
solo deben usarse una vez. Las cadenas se pueden volver a separar fácilmente usando strsplit()
:
unescape_html2 <- function(str){
html <- paste0("<x>", paste0(str, collapse = "#_|"), "</x>")
parsed <- xml2::xml_text(xml2::read_html(html))
strsplit(parsed, "#_|", fixed = TRUE)[[1]]
}
system.time(res2 <- unescape_html2(many_strings))
## user system elapsed
## 0.011 0.000 0.010
identical(res, res2)
## [1] TRUE
Por supuesto, debe tener cuidado de que la cadena que utiliza para combinar las distintas cadenas en str
( "#_|"
en mi ejemplo) no aparezca en ninguna parte en str
. De lo contrario, introducirá un error cuando la cadena grande se vuelva a dividir al final.
Unescape de valores xml / html usando el paquete xml2
:
unescape_xml <- function(str){
xml2::xml_text(xml2::read_xml(paste0("<x>", str, "</x>")))
}
unescape_html <- function(str){
xml2::xml_text(xml2::read_html(paste0("<x>", str, "</x>")))
}
Ejemplos:
unescape_xml("3 < x & x > 9")
# [1] "3 < x & x > 9"
unescape_html("€ 2.99")
# [1] "€ 2.99"
Actualización : esta respuesta está desactualizada. Por favor verifique la respuesta a continuación basada en el nuevo paquete xml2.
Intente algo a lo largo de las líneas de:
# load XML package
library(XML)
# Convenience function to convert html codes
html2txt <- function(str) {
xpathApply(htmlParse(str, asText=TRUE),
"//body//text()",
xmlValue)[[1]]
}
# html encoded string
( x <- paste("i", "s", "n", "&", "a", "p", "o", "s", ";", "t", sep = "") )
[1] "isn't"
# converted string
html2txt(x)
[1] "isn''t"
ACTUALIZACIÓN: Edité la función html2txt () para que se aplique a más situaciones.