将 HTML 转换为纯文本(包含 <br>s)



是否可以将Nokogiri的HTML转换为纯文本?我还想包含<br />标签。

例如,给定此 HTML:

<p>ala ma kota</p> <br /> <span>i kot to idiota </span>

我想要这个输出:

ala ma kota
i kot to idiota

当我只是调用Nokogiri::HTML(my_html).text时,它会排除<br />标签:

ala ma kota i kot to idiota

我没有编写复杂的正则表达式,而是使用了Nokogiri。

工作解决方案:

def strip_html(str)
  document = Nokogiri::HTML.parse(str)
  document.css("br").each { |node| node.replace("n") }
  document.text
end

默认情况下不存在这样的东西,但你可以轻松地将接近所需输出的东西组合在一起:

require 'nokogiri'
def render_to_ascii(node)
  blocks = %w[p div address]                      # els to put newlines after
  swaps  = { "br"=>"n", "hr"=>"n#{'-'*70}n" }  # content to swap out
  dup = node.dup                                  # don't munge the original
  # Get rid of superfluous whitespace in the source
  dup.xpath('.//text()').each{ |t| t.content=t.text.gsub(/s+/,' ') }
  # Swap out the swaps
  dup.css(swaps.keys.join(',')).each{ |n| n.replace( swaps[n.name] ) }
  # Slap a couple newlines after each block level element
  dup.css(blocks.join(',')).each{ |n| n.after("nn") }
  # Return the modified text content
  dup.text
end
frag = Nokogiri::HTML.fragment "<p>It is the end of the world
  as         we
  know it<br>and <i>I</i> <strong>feel</strong>
  <a href='blah'>fine</a>.</p><div>Capische<hr>Buddy?</div>"
puts render_to_ascii(frag)
#=> It is the end of the world as we know it
#=> and I feel fine.
#=> 
#=> Capische
#=> ----------------------------------------------------------------------
#=> Buddy?

试试

Nokogiri::HTML(my_html.gsub('<br />',"n")).text

> Nokogiri 将删除链接,所以我首先使用它来保留文本版本中的链接:

html_version.gsub!(/<a href.*(http:[^"']+).*>(.*)</a>/i) { "#{$2}n#{$1}" }

这将变成这个:

<a href = "http://google.com">link to google</a>

对此:

link to google
http://google.com

如果你使用 HAML,你可以通过将 html 与"原始"选项一起放置来解决 html 转换,例如

      = raw @product.short_description

相关内容

  • 没有找到相关文章

最新更新