2014-02-14 15 views
2

В моем тексте есть некоторые символы с экранированием HTML, например, вместо ' есть '. Теперь я хотел бы отменить эти последовательности. Поскольку я не знаю, какие символы экранированы, я не хочу использовать простое сопоставление, например, в c("'"="'", ...).Unescape HTML &#nn; последовательности

Я понимаю, что число после амперсанда - это десятичный номер юникода. Так ' является \u27 с 27 является шестнадцатеричным представлением 39. Таким образом, я думал, что решение, которое включает в себя

sprintf("\u%x", s) 

где s является извлеченным числом между & и ;. Однако это приводит к ошибке: «\ u используется без шестнадцатеричных чисел».

Что было бы лучшим подходом к преобразованию HTML-экранированных последовательностей в символы?

+0

Помогает ли [эта ссылка] (https://stat.ethz.ch/pipermail/r-help/2012-August/321478.html)? – jlhoward

+0

Немного, спасибо! –

ответ

2

Для справки, вот решение, с которым я столкнулся. Это делает использование большого пакета gsubfn:

library(gsubfn) 

Я использую вектор htmlchars для именованных HTML сущностей Я Царапины от Wikipedia. Для краткости я не скопировать вектор в этом ответ здесь, но источник его из pastebin:

source("http://pastebin.com/raw.php?i=XtzN1NMs") # creates variable htmlchars 

Теперь функция декодирования я искал просто:

strdehtml <- function(s) { 
    ret <- gsubfn("&#([0-9]+);", function(x) rawToChar(as.raw(as.numeric(x))), s) 
    ret <- gsubfn("&([^;]+);", function(x) htmlchars[x], ret) 
    return(ret) 
} 

Не уверен, если это охватывает все возможные символы HTML, но это заставляет меня работать. Например, она может быть использована следующим образом:

test <- "My this &amp; last year&#39;s resolutions" 
strdehtml(test) 
[1] "My this & last year's resolutions" 
0

Вы также можете позвонить Node.js из R в качестве системной команды. У Node.JS есть пакеты, которые делают именно это. Вот инструкции:

  1. Установка Node.js и NPM apt-get install nodejs npm
  2. Установка HTML-сущности пакет npm install html-entities
  3. вызова Node.js из R

print(system(command = "nodejs -e \"var Entities = require('html-entities').AllHtmlEntities; entities = new Entities(); console.log(entities.decode('&lt;&gt;&quot;&apos;&amp;&copy;&reg;&#8710;'));\""))

Вот выход из вышеуказанной команды

<>"'&©®∆

Смежные вопросы