我一直在寻找有关在页面中查找内容的问题,并且很多答案建议DOM
在解析网页时使用而不是REGEX
. 为什么会这样?它会改善处理时间还是什么。
3 回答
DOM 解析器实际上是在解析页面。
正则表达式是在搜索文本,而不是理解 HTML 的语义。
可以证明 HTML 不是常规语言;因此,不可能创建一个正则表达式来解析 HTML 文档中任意元素模式的所有实例,而不匹配一些不是该元素模式实例的文本。
您可能能够设计一个适用于您的特定用例的正则表达式,但是准确预见将提供给您的 HTML(以及因此它将如何破坏您的有限用例正则表达式)是非常困难的。
此外,正则表达式比 XPath 表达式更难适应页面内容的变化,而且 XPath(在我看来)更易于阅读,因为它不需要像标签打开和关闭这样的语法零碎。
因此,不要为工作使用错误的工具(用于结构化文档的文本解析工具),而是为工作使用正确的工具(用于解析 HTML 的 HTML 解析器)。
我再也听不到“HTML 不是常规语言……”了。正则表达式(如在今天的语言中使用的)也不是正则表达式。
简单的答案是:
正则表达式不是解析器,它描述了一个模式并且它将匹配该模式,但它不知道文档结构。您无法使用一个正则表达式解析任何内容。当然,正则表达式可以是解析器的一部分,我不知道,但我假设几乎每个解析器都会在内部使用正则表达式来查找某些子模式。
如果您可以为要在 HTML 中找到的内容构建该模式,那么可以使用它。但是很多时候你不能创建这种模式,因为它实际上不可能覆盖所有的极端情况,或者像找到所有链接这样的依赖关系,但前提是它们是绿色而不是粉红色。
在大多数情况下,使用解析器要容易得多,它可以理解文档的结构,也可以接受很多“损坏”的 HTML。它使您可以轻松访问所有链接或某个表格的所有表格元素,或者...
在我看来,在您无法控制内容的页面上使用 REGEXP 会更安全:HTML 可能没有正确形成,然后 DOM 解析器可能会失败。
编辑:
好吧,考虑到我刚刚读到的内容,只有在需要非常小的东西时才应该使用正则表达式,例如获取文档的所有链接等。