2013-11-14 5 views
9

Я знаю, что это было задано раньше, но я не могу найти хороший ответ для node.jsКак преобразовать HTML-страницу в обычный текст в node.js?

Мне нужна серверная часть для извлечения обычного текста (без тегов, скрипта и т. Д.) С HTML-страницы, которая извлекается.

Я знаю, как сделать это на стороне клиента с помощью jQuery (получить содержимое .text() тега body), но не знаю, как это сделать на стороне сервера.

Я пробовал https://npmjs.org/package/html-to-text, но это не обрабатывает скрипты.

var htmlToText = require('html-to-text'); 
    var request = require('request'); 
    request.get(url, function (error, result) { 
     var text = htmlToText.fromString(result.body, { 
      wordwrap: 130 
     }); 
    }); 

Я пробовал phantom.js, но не могу найти способ получить простой текст.

ответ

5

Использование jsdom и JQuery (на стороне сервера).

С помощью jQuery вы можете удалить все сценарии, стили, шаблоны и т. Д., А затем вы можете извлечь текст.

Пример

(Это не тестировалась с jsdom и узлом, только в Chrome)

jQuery('script').remove() 
jQuery('noscript').remove() 
jQuery('body').text().replace(/\s{2,9999}/g, ' ') 
+0

Как удалить скрипты? '$ .find (" script "). delete()' генерирует ошибку отсутствия такого метода. 'jsdom.env ({ url: url, scripts: [" http://code.jquery.com/jquery .js "], done: function (errors, window) { var $ = window. $; $ .find (" script "). delete();' – metalaureate

+0

try '$ ('script'). delete () ' – hgoebl

+0

" TypeError: Object [object Object] не имеет метода 'delete' ". Я задам этот вопрос как отдельный вопрос SO. – metalaureate

-3

Почему бы не просто получить textContent тега тела?

var body = document.getElementsByTagName('body')[0]; 
var bodyText = body.textContent; 
+4

Я знаю, что это старый ответ, но как будущая ссылка для других, node.js - это безголовый сервер, на котором запущен javascript, нет объекта документа (без использования библиотеки lib и ее создания вручную). Этот ответ, похоже, предполагает, что js запущен в браузере. – Metalskin

2

Вы можете использовать TextVersionJS (http://textversionjs.com), чтобы создать простую текстовую версию HTML строки. Это чистый javascript (с тоннами RegExps), поэтому вы можете использовать его и в браузере, и в node.js.

Эта библиотека может работать под ваши нужды, но есть NOT так же, как получение текста элемента в браузере. Его цель - создать текстовую версию HTML-письма. Это означает, что такие вещи, как изображения, включены. Например, учитывая следующий HTML и фрагмент кода:

var textVersion = require("textversionjs"); 
var htmlText = "<html>" + 
        "<body>" + 
         "Lorem ipsum <a href=\"http://foo.foo\">dolor</a> sic <strong>amet</strong><br />" + 
         "Lorem ipsum <img src=\"http://foo.jpg\" alt=\"foo\" /> sic <pre>amet</pre>" + 
         "<p>Lorem ipsum dolor <br /> sic amet</p>" + 
         "<script>" + 
          "alert(\"nothing\");" + 
         "</script>" + 
        "</body>" + 
       "</html>"; 
var plainText = textVersion.htmlToPlainText(htmlText); 

Переменная plainText будет содержать эту строку:

Lorem ipsum [dolor] (http://foo.foo) sic amet 
Lorem ipsum ![foo] (http://foo.jpg) sic amet 
Lorem ipsum dolor 
sic amet 

Обратите внимание, что это не правильно игнорировать теги сценария. Вы найдете последнюю версию source code на GitHub.

+0

Это, как представляется, создает строку содержимого HTML-содержимого с уценкой. Я замечаю это из того, как он интерпретирует привязки с указанными 'href' и' alt'. –

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