为什么使用dom来解析网页而不是正则表达式?

时间:2012-04-04 09:56:10

标签: php regex parsing dom search

我一直在搜索有关在网页中查找内容的问题,并且在解析网页而不是DOM时,很多答案都建议使用REGEX。为什么会这样?它是否会改善处理时间等。

3 个答案:

答案 0 :(得分:6)

DOM解析器实际上正在解析页面。

正则表达式正在搜索文本,而不是理解HTML的语义。

可以证明HTML不是常规语言;因此,不可能创建一个正则表达式,它将解析HTML文档中任意元素模式的所有实例,而不匹配某些不是该元素模式实例的文本。

可能能够设计一个适用于您的特定用例的正则表达式,但预测您将提供的HTML(以及它将如何打破您的限制) -use-case regex)非常困难。

此外,正则表达式更难以适应页面内容的变化而不是XPath表达式,并且XPath(在我看来)更容易阅读,因为它不需要关注语法开头和标签的结尾几率。关闭的系统。

因此,不是使用错误的工具(结构化文档的文本解析工具)而是使用正确的工具(用于解析HTML的HTML解析器)。

答案 1 :(得分:1)

我听不到“HTML不是常规语言......”了。正则表达式(在今天的语言中使用)也不常见。

简单的答案是:

正则表达式不是解析器,它描述了一个模式,它将匹配该模式,但它不知道文档结构。你不能用一个正则表达式解析任何东西。当然,正则表达式可以是解析器的一部分,我不知道,但我认为几乎每个解析器都会在内部使用正则表达式来查找某些子模式。

如果您可以为要在HTML中找到的内容构建该模式,那么使用它。但是,你经常无法创建这种模式,因为它实际上不可能覆盖所有的角落情况,或者像查找所有链接这样的依赖关系,但只有它们是绿色而不是粉红色。

在大多数情况下,它更容易使用Parser,它理解文档的结构,也接受大量“破坏”的HTML。它使您可以轻松访问所有链接或某个表的所有表格元素,或者......

答案 2 :(得分:-1)

在我看来,在您无法控制内容的网页上使用REGEXP更安全:HTML 可能没有正确形成,那么DOM解析器可能会失败。

编辑:
好吧,考虑到我刚读到的内容,你应该只在需要非常小的东西时使用regexp,例如获取文档的所有链接,等等。