我想将html转换为纯文本。不过,我不想只是剥离标签,我想智能地保留尽可能多的格式。插入<br>
标签的换行符,检测段落并设置其格式等。
输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有锚点或图像)。
我可以把几个正则表达式放在一起,让我达到 80%,但认为可能有一些现有的解决方案具有更多的智能。
首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着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"
,然后用换行符替换<br>
标记。关于SO有很多问题,解释了如何用其他东西替换标签。我认为Nokogiri网站也有这个教程之一。
如果你真的想做对,你需要弄清楚你想对<ul>
和<ol>
标签中的<li>
标签以及表做什么。
另一种攻击方法是捕获其中一个文本浏览器(如 lynx)的输出。几年前,我需要对不使用元关键字标签的网站上的关键字进行文本处理,并找到了其中一个文本浏览器,可以让我以这种方式获取呈现的输出。我没有可用的来源,所以我无法检查它是哪一个。