2012-08-04 301 views
1

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

  • 事先并不知道文档是否包含HTML。
  • 更可能的是,任何HTML格式都会很差。
  • 单个文档可能非常大,也许数百兆字节。
  • 由于任何奇怪的原因,非HTML内容可能仍然会被尖括号散布,所以沿着<.+/?>的行的朴素正则表达式是不合适的。 (无论如何,剥离XML是不太理想的。)

我目前使用HTML Agility Pack,它只是不切割芥末。性能比我想要的更差,它并不总是能够尽可能优雅地处理真正糟糕的格式化,最近我遇到了一些堆栈溢出的问题,这些问题在一些更令人生气的大文件上出现。

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

使用正则表达式似乎是明显的候选。但后来我记得this famous answer,这让我担心这不是一个好主意。但是,谩骂的观点非常关注解析,而不一定是愚蠢的标签剥离。那么正则表达式可以达到这个目的吗?

假设这不是一个可怕的想法,那么对于可以很好地工作的正则表达式的建议是非常受欢迎的。

+1

我们都读过这样的杰作......我说的是你引用的答案:) ......无论如何我们也知道使用正则表达式来处理html数据时通常很难说。我不清楚你的意思是什么意思,“我只是希望(大部分)标签消失。你是指符合特定标准的特定标签及其所有内容? – 2012-08-04 15:34:10

+0

因为由于正则表达式模式无法描述层次结构,因此您可能使用它们只是为了实现你自己的解析策略,用正则表达式提取部分文本,并委托责任人保留或从最终结果中删除它。我不知道性能......也许不好。 – 2012-08-04 15:41:00

+0

@DiegoDeVita我的意思是我需要从流中去除HTML标签,并保留其他内容,我说“大部分”是因为100%的可靠性不是必须的,如果奇怪的浏览器特定标签使它通过,那很好,因为该数据被传递到旨在接受嘈杂数据的软件 – 2012-08-04 18:06:00

回答

1

这个正则表达式找到所有标签避免在括号内的引号中的尖括号。

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

这是无法检测,引号里的转义引号(但我认为这是在HTML不必要的)

拥有所有合法的标签列表,并在正则表达式的第一部分替换它,像<(tag1|tag2|...)可以带来更精确的解决方案,我怕一个确切的解决方案无法开始与你的尖括号假设可以发现,认为例如为类似<a href="test.html"> b<a </a> ...

编辑

更新了正则表达式(表现比后者好得多),而且如果你需要去除代码,我建议在第一次启动之前进行一点清理,就像用<script.+?</script>什么也没有。

+0

我结束了很多事情。实际上有一系列正在运行的正则表达式:一个用于处理标签之间的所有内容都需要执行的事情 - 脚本,正如您所建议的,还包括标头,样式和其他一些内容。一对夫妇处理需要用空白替换的特定标签。还有一个像上面这样的通用处理器,可以处理其他所有事情,尽管它最终会变得相当复杂一些,以便使其误报率降到最低。 – 2012-08-23 00:21:27

+0

好!然后发布你的正则表达式! (请:)) – Gabber 2012-08-23 06:48:23

+1

以下是一般版本:'“”] *“” ^>'] *'| [ - \ w:;,\ ./#=&_ \?@ \(\)\ +%!\ *] *))?)* \ s * /?>'通过替换前导的'\ w'来创建特定的代码,并且如果不应该替换close代码,则省略前面的'/?'。 – 2012-08-23 13:48:47

1

我只是在这个盒子外面思考,但你可能会考虑利用诸如Microsoft Word或OpenOffice之类的东西。

我使用Word automation将HTML翻译为DOC,RTF或TXT。 Word原生的HTML to TXT转换将为您提供您想要的内容,剥离所有HTML标签并将其转换为文本格式。当然,如果你正在处理大量微型HTML文件,那么这将毫无用处,因为在这一切中都有一些开销。但是,如果你正在处理大量文件,这可能不是一个不错的选择,因为我确信Word对这些转换进行了大量优化。您可以通过在Word中手动打开一个最大的HTML文件并将其保存为TXT文件并查看Word保存多长时间来测试此理论。

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