Ответ 1
На самом деле это намного проще:
require 'rubygems'
require 'nokogiri'
puts Nokogiri::HTML(my_html).text
У вас все еще есть проблемы с разрывом строк, поэтому вам нужно будет выяснить, как вы хотите справиться с ними самостоятельно.
Есть ли что-нибудь, чтобы преобразовать html в обычный текст (возможно, nokogiri script)? Что-то, что удержит разрыв строки, но об этом.
Если я напишу что-то в googledocs, например this, и запустим эту команду, он выведет (удаление css и javascript), это:
\n\n\n\n\nh1. Test h2. HELLO THEREI am some teexton the next line!!!OKAY!#*!)$!
Итак, форматирование все испортилось. Я уверен, что кто-то решил детали, подобные этим где-то там.
На самом деле это намного проще:
require 'rubygems'
require 'nokogiri'
puts Nokogiri::HTML(my_html).text
У вас все еще есть проблемы с разрывом строк, поэтому вам нужно будет выяснить, как вы хотите справиться с ними самостоятельно.
Вы можете начать с чего-то вроде этого:
require 'open-uri'
require 'rubygems'
require 'nokogiri'
uri = 'http://stackoverflow.com/questions/2505104/html-to-plain-text-with-ruby'
doc = Nokogiri::HTML(open(uri))
doc.css('script, link').each { |node| node.remove }
puts doc.css('body').text.squeeze(" \n")
Является ли просто зачищающими тегами и допустимыми допустимые перерывы?
html.gsub(/<\/?[^>]*>/, '').gsub(/\n\n+/, "\n").gsub(/^\n|\n$/, '')
Первые метки полос, второй - разрывы дубликатов строк до одного, третий удаляет разрывы строк в начале и конце строки.
Я использую камень для sanitize
.
(" " + Sanitize.clean(html).gsub("\n", "\n\n").strip).gsub(/^ /, "\t")
Однако он отбрасывает гиперссылки, что может быть проблемой для некоторых приложений. Но я занимаюсь анализом текста НЛП, так что это идеально подходит для моих нужд.
require 'open-uri'
require 'nokogiri'
url = 'http://en.wikipedia.org/wiki/Wolfram_language'
doc = Nokogiri::HTML(open(url))
text = ''
doc.css('p,h1').each do |e|
text << e.content
end
puts text
Это извлекает только желаемый текст с веб-страницы (большую часть времени). Если, например, вы хотели бы также включить ссылки, добавьте a
в классы css в блоке.
Вы хотите hpricot_scrub:
http://github.com/UnderpantsGnome/hpricot_scrub
Вы можете указать, какие теги нужно разбить/сохранить в хеше конфигурации.
Если вы используете рельсы, вы можете:
html = '<div class="asd">hello world</div><p><span>Hola</span><br> que tal</p>'
puts ActionView::Base.full_sanitizer.sanitize(html)
если это в рельсах, вы можете использовать это:
html_escape_once(value).gsub("\n", "\r\n<br/>").html_safe
Строя немного на ответе Matchu, это сработало для моих (очень похожих) требований:
html.gsub(/<\/?[^>]*>/, ' ').gsub(/\n\n+/, '\n').gsub(/^\n|\n$/, ' ').squish
Надеюсь, что это немного облегчит жизнь: -)