以编程方式清除Word生成的HTML并保留样式?

9
在我现在的公司,我们有一个十年历史的……让我们称之为“Hello World”应用程序。
虽然想要创建一个更新版本,但我们也想保留旧条目。这些旧条目包含丑陋的Word生成的HTML,以前从未过滤过。
如果我们转移到新系统,我希望将该HTML清理和过滤,以使网站尽可能符合HTML标准。
然而,仅仅像Jeff Atwood在他的博客中描述的那样或者我所知道的其他方式清理代码,也会破坏样式和格式。
现在,这可能会导致我们的用户反叛,然后一切都会失控——这不是一个很好的主意。
因此问题是:可以在保留基本格式的同时清理Word的HTML吗?(例如:着色、斜体、粗体等)

最好使用公开可用的代码或库,例如HTML Tidy,非常欢迎使用C#示例。


你最有可能得到的工作示例将是用 PERL 编写的。它强大的文本处理能力和与正则表达式的集成使其非常适合这个任务。我以这种方式清理过 Front Page,但从未不幸地需要用同样的方法清理 Word。 - Grant Johnson
@scope-creep:好的,HTML标准 :P - GeReV
抱歉GeReV,我有点固执。我在周末做了一个演示,讲座说yip,xhtml作为标准已经不再继续前进了。 - scope_creep
8个回答

3
有几个选项可用,但你可以使用Jeff Atwood的代码作为自己编写的好起点。这样,你可能会得到对结果的精细控制 - 请注意,尽管所有额外的ms代码实际上都是为了在往返过程中尽可能保持与原始文档的一致性(至少在IE中),但结果永远不会达到100%的准确性。但大多数代码都能保留大部分格式。
以下是一些可能有用的代码库:
- Microsoft Word 2000 HTML Mess Cleaner(注意:此代码销售源代码) - MS Word HTML Cleanup Tool(注意:旨在与FCKEditor配合使用,但提供源代码)
如果您只想进行批处理(并且不关心拥有代码库),那么Office 2000 HTML Filter 2.0可能是您最好的选择 - 在TechRepublic上了解更多。

2

tidy对于清理和规范化html语法非常有效。

它非常灵活,因此对于批量清理,命令行工具很可能可以满足您的需求。您不需要自己编写tidylib。

如果您需要进行更复杂的内容清理-不仅仅是语法-某些xslt处理器(例如xsltproc)具有“--html”选项:输入文件由html解析器而不是xml解析器解析。然后,您可以使用xslt转换或重新排列内容,然后使用html序列化程序输出。


2

这个SO问题提出了一个类似的问题,尽管在那里不需要程序化的清理。

其中一个答案提到Office 2007有一个发布->博客菜单项,据称产生良好的结果并且速度快。你可以从Word中创建一个宏来调用此命令,然后以编程方式调用该宏。您可以使用COM或VBScript启动Word并运行该宏,或者使用/m开关运行winword.exe。有关给出winword.exe的命令行开关,请单击此处


1

你有预算吗?这可能会起作用。试用后再购买。


@scopr-creep:谢谢,但我正在寻找一种可以在本地运行的解决方案,用于处理数千个文件的批处理。 - GeReV

1

看一下FCKEditor,它是一个基于JavaScript的编辑器,因此查看源代码可能会给你很多提示,以便在删除单词HTML时寻找要查找的内容。

特别是,请查看文件/editor/dialog/fck_paste.html。有一个函数"CleanWord"可以完成所有操作。我已经修改了它以供我的应用程序使用(稍微修改,即不同的替换等),但它非常擅长消除丑陋的Word HTML。

它使用正则表达式查找和替换,这意味着您可以轻松地提取正则表达式并将其导入到您选择的另一种编程语言中以运行批处理作业。


从我的经验来看,新版CKEditor 的Word粘贴功能只会打开一个标准文本框,并忽略所有格式。FCKEditor在这方面有所不同吗? - GeReV
1
FCKEditor是一个较旧的版本。他们将其更名为CKEditor,因为“FCK”看起来像F-word(创建者是巴西人,所以没有意识到这一点)。 - Anton

1

PSPad 包含 tidy 工具,其中有一个“清理 Microsoft Word 2000”选项,我以前用过它来处理 word 文档,并且可以自定义设置。


Chrome 报告此下载文件为恶意文件。不确定是否真的是,但不想冒险。 - Tom Styles
完全可以理解。这个答案是在4年前写的,但我仍然经常使用它。我会说这是一个误报,但总有可能发生变化。 - McAden
为了避免与 PsPad 捆绑的“潜在不受欢迎的程序”(即 PUP)的任何风险,请下载 PsPad 的“便携式”版本 - 这只是一个没有安装程序或 PUP 的 zip 文件。 - MikeOnline

1

HtmlRuleSanitizer(可在NuGet上获取)可以帮助您完成此操作。

它使用HTML Agility Pack解析HTML代码,并使用基于白名单的规则集来保留格式。默认规则集将消除几乎所有冗长的MS Word HTML代码,同时保留基本文档结构,如标题标签、加粗、斜体等。

如果您想保留特定的MS Word样式,则需要为您的用例创建或调整规则集。

例如,它将轻松地将包含以下内容的文档生成的数百行HTML代码转换为以下一组相对干净的HTML:

Heading one

Paragraph

Heading two

Bold

Italic

A Link

只需使用以下相对干净的HTML:

<html>
<body>
<h1><span>Heading</span> <span>one</span></h1>
<p><span>Paragraph</span></p>
<h2><span>Heading</span> <span>two</span></h2>
<p><span><strong>Bold</strong></span><strong></strong></p>
<p><span><i>Italic</i></span><i></i></p>
<p><i><a href="http://www.google.com/" target="_blank" rel="nofollow">Link</a></i></p>
</body>
</html>

请注意,一些令人讨厌的事情,如MS Word经常打开和关闭标签(请参见示例中的span元素),并没有完全清除。

0
这里有一组PowerShell脚本,可以清理Word过滤的HTML并正确标记上下标约95%的时间。(不,你无法做得比这更好,Word是为打印而设计的。)

https://github.com/suzumakes/replaceit

基本格式保持不变,<br>标签变成<br>标签,<p>标签变成<p>标签。我想这就是你要找的,虽然你不应该使用正则表达式来解析HTML,但经过这些PowerShell脚本处理后,Word-Filtered HTML几乎没有被过滤,但它变得更加干净。

在ReadMe中有说明,如果你遇到任何需要捕捉的额外字符或者想出任何调整/改进,我很乐意看到你的pull request。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接