【问题标题】:Stripping HTML tags without using HtmlAgilityPack在不使用 HtmlAgilityPack 的情况下剥离 HTML 标签
【发布时间】: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>。在属性内容中禁止使用尖括号可能会很好,以帮助控制此类事情。

标签: c# .net html regex


【解决方案1】:

此正则表达式查找所有标签,避免标签中引号内的尖括号。

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

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

拥有所有允许标签的列表并在正则表达式的第一部分替换它,比如&lt;(tag1|tag2|...) 可以带来更精确的解决方案,恐怕从你的假设开始就找不到确切的解决方案尖括号,例如像&lt;a href="test.html"&gt; b&lt;a &lt;/a&gt;...

编辑

更新了正则表达式(性能比后者好很多),此外,如果您需要删除代码,我建议在第一次启动之前进行一些清理,例如将 &lt;script.+?&lt;/script&gt; 替换为空。

【讨论】:

  • 我最终选择了类似的东西。实际上有一系列正则表达式正在运行:一个用于处理标记之间的所有内容都需要执行的事情 - 脚本,如您所建议的那样,还有标题、样式和其他一些东西。一对处理需要用空格替换的特定标签。还有一个像上面这样的通用的,可以处理其他所有事情,尽管它最终变得相当复杂,以降低误报率。
  • 好!然后发布您的正则表达式! (请:))
  • 这里是通用版本:'?\w+(?:\s+[-\w:]+(?:=(?:""[^>""]*""| '[^>']*'|[-\w:;,\./#=&_\?@()\+%!*]*))?)*\s*/?>' 标签特定它们是通过替换前导 \w 来创建的,如果不应替换关闭标签,则省略前导 /?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多