require 'nokogiri'
class HtmlToText
class << self
def process html
nokogiri = Nokogiri::HTML(html)
text = ''
nokogiri.traverse do |el|
if el.class == Nokogiri::XML::Element
sep = inline_element?(el) ? "" : "\n"
if el.children.length <= 0
text += "#{sep}"
else
text = "#{sep}#{sep}#{text}#{sep}#{sep}"
end
elsif el.class == Nokogiri::XML::Text
text += el.text
end
end
text.gsub(/\n{3,}/, "\n\n").gsub(/(\A\n+)|(\n+\z)/, "")
end
private
def inline_element? el
el && el.try(:name) && inline_elements.include?(el.name)
end
def inline_elements
%w(
a abbr acronym b bdo big br button cite code dfn em i img input
kbd label map object q samp script select small span strong sub
sup textarea time tt var
)
end
end
end
2条答案
按热度按时间6jjcrrmo1#
你可以使用
#before
和#after
来添加新行:toiithl62#
这是我的解决方案:
我遍历nokogiri树,构建一个文本字符串,对于块元素用
"\n\n"
Package 文本,对于行内元素用""
Package 文本。然后使用gsub
来清除最后\n
字符的丰度。有点古怪但很管用。