【问题标题】:HTML to Plain Text with Ruby?使用 Ruby 将 HTML 转为纯文本?
【发布时间】:2010-03-24 03:14:25
【问题描述】:

有没有什么东西可以将 html 转换为纯文本(可能是 nokogiri 脚本)?可以保持换行符的东西,但仅此而已。

如果我在 googledocs 上写一些东西,比如 this,然后运行该命令,它会输出(删除 css 和 javascript),这个:

\n\n\n\n\nh1. Test h2. HELLO THEREI am some teexton the next line!!!OKAY!#*!)$!

所以格式都搞砸了。我敢肯定有人已经在某处解决了这些细节。

【问题讨论】:

  • 如果您使用的是 Rails,您可以使用 strip_tags,在此之前只需运行 Gsub 将
    替换为 \n

标签: ruby


【解决方案1】:

其实这要简单得多:

require 'rubygems'
require 'nokogiri'

puts Nokogiri::HTML(my_html).text

不过,您仍然遇到换行问题,因此您必须自己弄清楚要如何处理这些问题。

【讨论】:

  • 没错,但这样你就不会摆脱
【解决方案2】:

如果您使用的是轨道,您可以: html = '<div class="asd">hello world</div><p><span>Hola</span><br> que tal</p>' puts ActionView::Base.full_sanitizer.sanitize(html)

【讨论】:

    【解决方案3】:

    你可以这样开始:

    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")
    

    【讨论】:

    • 如果您想多做一些清理工作,请将最后一行替换为: puts doc.css('body').text.split("\n")。收集{ |行| line.strip }.join("\n")
    • 这真的很接近!我在docs.google.com/View?id=dffk85xk_63f29hv2hn 上运行了它,它几乎是完美的。它只是不包括第一个新行(内容周围的

      标记)。有没有办法把它包括在内?
    • 嗯。什么都没有在我身上跳出来。你确定你不想只通过 lynx 进行管道传输吗?
    • 您还可以一次性获取所有脚本和链接节点,如下所示: doc.css('script, link').each { |node|节点删除}
    • 好点 ema ~ 我总是忘记 Nokogiri 在真正的 css 选择器方面有多好 :)
    【解决方案4】:

    我正在使用sanitize gem。

    (" " + Sanitize.clean(html).gsub("\n", "\n\n").strip).gsub(/^ /, "\t")
    

    不过,它确实会删除超链接,这对于某些应用程序来说可能是个问题。但我正在做 NLP 文本分析,所以这非常适合我的需求。

    【讨论】:

      【解决方案5】:
      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 类中。

      【讨论】:

        【解决方案6】:

        是否可以简单地去除标签和多余的换行符?

        html.gsub(/<\/?[^>]*>/, '').gsub(/\n\n+/, "\n").gsub(/^\n|\n$/, '')
        

        第一个去除标签,第二个将重复的换行符分解为一个,第三个删除字符串开头和结尾的换行符。

        【讨论】:

        • 我希望,但我希望文本具有相同的间距/中断(至少它的显示方式)。如果 HTML 中有双倍行距,有时会使用它转换为 5-10 个换行符。更新了问题。
        • @viatropos:那么简单地删除多余的换行符是否可以接受?
        • 那么我最终必须构建自己的解析器:)。现在真的没有时间这样做。
        • @viatropos:为什么删除多余的换行符需要解析器?请参阅编辑后的答案。
        • 寻找已经解决了这些小问题的东西。不过感谢您的帮助,当我有一段时间后,我会努力解决它。在那之前,如果有什么东西准备好了,那就太棒了。
        【解决方案7】:

        你想要 hpricot_scrub:

        http://github.com/UnderpantsGnome/hpricot_scrub

        您可以指定要剥离/保留在配置哈希中的标签。

        【讨论】:

          【解决方案8】:

          如果它在rails中,你可以使用这个:

          html_escape_once(value).gsub("\n", "\r\n<br/>").html_safe
          

          【讨论】:

            【解决方案9】:

            基于 Matchu 的回答,这适用于我的(非常相似的)要求:

            html.gsub(/<\/?[^>]*>/, ' ').gsub(/\n\n+/, '\n').gsub(/^\n|\n$/, ' ').squish
            

            希望它能让某人的生活更轻松:-)

            【讨论】:

            • "squish" 可能只是 Rails 方法。使用 String::strip 似乎是一个合适的选择(至少对于我需要的转换)。
            猜你喜欢
            相关资源
            最近更新 更多
            热门标签