使用ruby将HTML转换为纯文本并维护结构/格式

Joh*_*hir 5 ruby hpricot beautifulsoup html-parsing nokogiri

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

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

我可以把几个正则表达式放在一起,让我80%,但想到可能有一些现有的解决方案具有更多的智能.

the*_*Man 8

首先,不要试图使用正则表达式.可能性非常好,你会想出一个脆弱/脆弱的解决方案,它会破坏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.
Run Code Online (Sandbox Code Playgroud)

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

问题是当您将解析器的输出或任何查看HTML的方法与浏览器显示的内容进行比较时.浏览器关注的是以尽可能愉快的方式呈现HTML,而忽略了HTML可能会出现严重错误和破坏的事实.解析器不是为此而设计的.

您可以在提取内容之前按下HTML以删除无关的换行符,例如"\n","\r"然后<br>使用换行符替换标记.这里有很多问题,解释了如何用其他东西替换标签.我认为Nokogiri网站也将其作为教程之一.

如果你真的想要做得对,你需要弄清楚你想要为<li>里面的标签<ul><ol>标签做什么,以及表格.

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