【发布时间】:2012-08-04 04:55:28
【问题描述】:
我需要一种有效且(合理)可靠的方法来从文档中去除 HTML 标记。它需要能够处理一些相当不利的情况:
- 根本不知道文档是否包含 HTML。
- 很可能任何 HTML 的格式都会很差。
- 单个文档可能非常大,可能有数百兆字节。
- 无论出于什么奇怪的原因,非 HTML 内容可能仍会充斥着尖括号,所以像
<.+/?>这样的幼稚正则表达式是不行的。 (无论如何,剥离 XML 是不太可取的。)
我目前正在使用 HTML Agility Pack,它只是不切实际。性能比我想要的要差,它并不总是尽可能优雅地处理真正糟糕的格式,最近我遇到了一些更令人不安的大文件的堆栈溢出问题。
我怀疑所有这些问题都源于它试图实际解析数据,这使得它不适合我的需求。我不想要语法树;我只想(大部分)标签消失。
使用正则表达式似乎是显而易见的选择。但后来我记得this famous answer 这让我担心这不是一个好主意。但是那个谩骂的重点非常集中在解析上,而不一定是愚蠢的标签剥离。那么正则表达式可以用于此目的吗?
假设这不是一个糟糕的想法,非常欢迎对正则表达式提出好的建议。
【问题讨论】:
-
我们都读过这样的杰作......我说的是你引用的答案:)......无论如何我们也知道在使用正则表达式处理 html 数据时通常很难说话.我不清楚您的意思是“我只是希望(大部分)标签消失。您是指符合特定标准的特定标签及其所有内容吗?
-
因为正则表达式模式无法描述层次结构,您可以使用它们来实现您自己的解析策略,使用正则表达式提取部分文本,并委派从最终结果中保留或删除它的责任。我对性能一无所知...可能不好。
-
@DiegoDeVita 我的意思是我需要从流中去除 HTML 标签,并保持其余内容不变。我说“大部分”是因为不需要 100% 的可靠性。如果奇怪的特定于浏览器的标签可以通过,那很好,因为数据被传递给旨在接受嘈杂数据的软件。
-
这取决于 html 的格式可能有多糟糕。
<a href="url>url</a>之类的东西(请注意缺少的引号)会弄乱所有内容,直到文件结束(并且它会使页面在大多数浏览器中损坏)。最坏的情况:没有更多的 " 将显示到文件末尾。在链接之后省略页面的其余部分仍然可以吗? -
@Gabber 最好拒绝(而不是剥离)
<a href="url>。不过,仍然可以删除</a>。在属性内容中禁止使用尖括号可能会很好,以帮助控制此类事情。