spanish from choose accents html r encoding character-encoding

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", "&amp; &apos; &gt;", "&amp;", "&euro; &lt;") 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 &lt; x &amp; x &gt; 9") # [1] "3 < x & x > 9" unescape_html("&euro; 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&apos;t" # converted string html2txt(x) [1] "isn''t"

ACTUALIZACIÓN: Edité la función html2txt () para que se aplique a más situaciones.