在不使用HtmlAgilityPack的情况下剥离HTML标记

本文关键字:情况下 剥离 HTML 标记 HtmlAgilityPack | 更新日期: 2024-10-23 06:18:39

我需要一种高效且(合理)可靠的方法来从文档中剥离HTML标记。它需要能够处理一些相当不利的情况:

  • 目前还不知道文档是否包含HTML
  • 更有可能的是,任何HTML的格式都会非常糟糕
  • 单个文档可能非常大,可能有数百兆字节
  • 无论出于什么奇怪的原因,非HTML内容可能仍然充斥着尖括号,所以像<.+/?>这样天真的正则表达式是不可能的。(无论如何,剥离XML是不太可取的。)

我目前使用的是HTML敏捷包,它并没有切中要害。性能比我想要的要差,它并不总是像它所能优雅地处理真正糟糕的格式,最近我遇到了一些更令人不安的大文件的堆栈溢出问题。

我怀疑所有这些问题都源于它试图实际解析数据的事实,这使得它很难满足我的需求。我不想要语法树;我只想(大部分)标签消失。

使用正则表达式似乎是显而易见的候选者。但后来我想起了这个著名的答案,这让我担心这不是一个好主意。但这篇文章的重点是解析,而不一定是愚蠢的标签剥离。那么regex可以用于此目的吗?

假设这不是一个糟糕的想法,那么regex的建议将非常受欢迎。

在不使用HtmlAgilityPack的情况下剥离HTML标记

此正则表达式查找所有避免在标记中引号内使用尖括号的标记。

<[a-zA-Z0-9/_-]+?((".*?")|([^<"']+?)|('.*?'))*?>

它无法检测引号中的转义引号(但我认为在html中没有必要)

有了所有允许的标签的列表并将其替换在正则表达式的第一部分中,比如<(tag1|tag2|...),可能会带来更精确的解决方案,恐怕从你对尖括号的假设开始,就找不到确切的解决方案了,比如说<a href="test.html"> b<a </a>。。。

编辑

更新了regex(性能比后者好得多),此外,如果您需要剥离代码,我建议在第一次启动前进行一点清理,比如什么都不替换<script.+?</script>

我只是跳出框框思考,但您可能会考虑利用Microsoft Word或OpenOffice之类的东西。

我已经使用Word自动化将HTML翻译成DOC、RTF或TXT。Word原生的HTML到TXT的转换将提供您想要的内容,剥离所有HTML标记并将其转换为文本格式。当然,如果你要处理大量的小HTML文件,这根本不会有效率,因为所有这些都有一些开销。但如果你要处理大量文件,这可能不是一个糟糕的选择,因为我相信Word在这些转换方面有很多优化。你可以通过手动打开Word中最大的HTML文件之一,并将其重新保存为TXT文件来测试这一理论,看看Word需要多长时间才能保存。

虽然我还没有尝试过,但我敢打赌,通过编程与OpenOffice交互来完成类似的事情是可能的。