我想将html转换为纯文本。我不想只删除标签,我想尽可能智能地保留尽可能多的格式。为<br>
标签插入换行符,检测段落并将其格式化等等。
输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有锚点或图像)。
我可以将几个正则表达式放在一起,让我80%,但可能会有一些现有的解决方案具有更多智能。
答案 0 :(得分: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.
这样做的原因是Nokogiri正在返回文本节点,这些节点基本上是标签周围的空白,以及标签中包含的文本。如果您使用tidy
对HTML进行飞行前清理,则有时可以获得更好的输出。
问题在于您将解析器的输出或任何查看HTML的方式与浏览器显示的内容进行比较。浏览器关注的是以尽可能愉快的方式呈现HTML,而忽略了HTML可能会出现严重错误和破坏的事实。解析器不是为此而设计的。
您可以在提取内容之前按下HTML以删除多余的换行符,例如"\n"
和"\r"
,然后使用换行符替换<br>
标记。这里有很多问题,解释了如何用其他东西替换标签。我认为Nokogiri site也是其中一个教程。
如果你真的想要做得对,你需要弄清楚你想要对<li>
和<ul>
标签内的<ol>
标签以及表格做些什么。< / p>
另一种攻击方法是捕获其中一个文本浏览器的输出,如lynx。几年前,我需要对没有使用Meta-Keyword标签的网站上的关键字进行文本处理,并找到一个允许我以这种方式获取渲染输出的文本浏览器。我没有可用的来源,所以我无法检查它是哪一个。