【问题标题】:Convert HTML to plain text and maintain structure/formatting, with ruby使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式
【发布时间】:2011-08-29 17:36:15
【问题描述】:

我想将 html 转换为纯文本。我不想只是剥离标签,我想智能地保留尽可能多的格式。为<br> 标签插入换行符,检测段落并对其进行格式化等。

输入非常简单,通常是格式良好的 html(不是整个文档,只是一堆内容,通常没有锚点或图像)。

我可以将几个正则表达式放在一起,让我达到 80%,但我认为可能存在一些更智能的现有解决方案。

【问题讨论】:

    标签: ruby html-parsing nokogiri beautifulsoup hpricot


    【解决方案1】:

    首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着 HTML 的变化而中断,或者很难管理和维护。

    您可以使用 Nokogiri 解析 HTML 并提取文本非常快速地完成其中的一部分:

    require 'nokogiri'
    
    html = '
    <html>
    <body>
      <p>This is
      some text.</p>
      <p>This is some more text.</p>
      <pre>
      This is
      preformatted
      text.
      </pre>
    </body>
    </html>
    '
    
    doc = Nokogiri::HTML(html)
    puts doc.text
    
    >>  This is
    >>  some text.
    >>  This is some more text.
    >>  
    >>  This is
    >>  preformatted
    >>  text.
    

    这样做的原因是 Nokogiri 正在返回文本节点,这些节点基本上是标签周围的空白,以及标签中包含的文本。如果您使用 tidy 对 HTML 进行飞行前清理,您有时可以获得更好的输出。

    问题在于当您将解析器的输出或任何查看 HTML 的方式与浏览器显示的内容进行比较时。浏览器关心以尽可能令人愉悦的方式呈现 HTML,而忽略了 HTML 可能会严重畸形和损坏的事实。解析器不是为此而设计的。

    您可以在提取内容之前对 HTML 进行处理以删除无关的换行符,例如 "\n""\r",然后将 &lt;br&gt; 标记替换为换行符。 SO上有很多问题解释如何用其他东西替换标签。我认为Nokogiri site 也将其作为教程之一。

    如果你真的想把它做好,你需要弄清楚你想对&lt;ul&gt;&lt;ol&gt;标签内的&lt;li&gt;标签以及表格做什么。

    另一种攻击方法是捕获其中一个文本浏览器(如 lynx)的输出。几年前,我需要对不使用 Meta-Keyword 标签的网站上的关键字进行文本处理,并找到了一个文本浏览器,它可以让我以这种方式获取呈现的输出。我没有可用的源,所以我无法查看它是哪一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2011-01-25
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多