2011-05-20 48 views
5

我想将html转换为纯文本格式。我不想仅仅去掉标签,我想尽可能地保留尽可能多的格式。插入<br>标签的换行符,检测段落并将其格式化等等。将HTML转换为纯文本并保持结构/格式,使用ruby

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

我可以将几个正则表达式组合在一起,让我有80%的存在,但是可能会有一些现有解决方案具有更多的智能。

回答

7

首先,不要尝试为此使用正则表达式。这个可能性非常好,你会想出一个脆弱/脆弱的解决方案,它会随着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>标签以及表格。

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

相关问题