如何解析 HTML/XML 并从中提取信息?
我更喜欢使用其中一种原生 XML 扩展,因为它们与 PHP 捆绑在一起,通常比所有 3rd 方库都快,并且为我提供了对标记的所有控制。
DOM 扩展允许您使用 PHP 5 通过 DOM API 对 XML 文档进行操作。它是 W3C 文档对象模型核心级别 3 的实现,这是一个平台和语言中立的接口,允许程序和脚本动态访问和更新文件的内容、结构和风格。
DOM 能够解析和修改真实世界(损坏的)HTML,并且可以进行XPath 查询。它基于libxml。
使用 DOM 需要一些时间来提高工作效率,但 IMO 非常值得。由于 DOM 是一个与语言无关的接口,您会发现许多语言的实现,因此如果您需要更改您的编程语言,那么您很可能已经知道如何使用该语言的 DOM API。
介绍了如何使用 DOM 扩展,因此如果您选择使用它,您可以确定您遇到的大多数问题都可以通过搜索/浏览 Stack Overflow 来解决。
XMLReader 扩展是一个 XML 拉解析器。阅读器充当文档流上的光标,并在途中的每个节点处停止。
XMLReader 和 DOM 一样,都是基于 libxml。我不知道如何触发 HTML 解析器模块,因此使用 XMLReader 解析损坏的 HTML 的机会可能不如使用 DOM 强大,您可以明确告诉它使用 libxml 的 HTML 解析器模块。
此扩展允许您创建 XML 解析器,然后为不同的 XML 事件定义处理程序。每个 XML 解析器还有一些可以调整的参数。
XML Parser 库也是基于 libxml,并实现了SAX风格的 XML 推送解析器。它可能是比 DOM 或 SimpleXML 更好的内存管理选择,但比 XMLReader 实现的拉式解析器更难使用。
SimpleXML 扩展提供了一个非常简单且易于使用的工具集,用于将 XML 转换为可以使用普通属性选择器和数组迭代器处理的对象。
当您知道 HTML 是有效的 XHTML 时,SimpleXML 是一个选项。如果您需要解析损坏的 HTML,甚至不要考虑 SimpleXml,因为它会阻塞。
如果您更喜欢使用第 3 方库,我建议您使用实际上在下面使用DOM / libxml的库,而不是字符串解析。
FluentDOM 为 PHP 中的 DOMDocument 提供了一个类似 jQuery 的 fluent XML 接口。选择器是用 XPath 或 CSS 编写的(使用 CSS 到 XPath 转换器)。当前版本扩展了 DOM 实现标准接口并添加了 DOM 生活标准的功能。FluentDOM 可以加载 JSON、CSV、JsonML、RabbitFish 等格式。可以通过 Composer 安装。
Wa72\HtmlPageDom是一个 PHP 库,用于使用 DOM 轻松操作 HTML 文档。它需要来自 Symfony2 组件的 DomCrawler来遍历 DOM 树,并通过添加用于操作 HTML 文档的 DOM 树的方法来扩展它。
Wa72\HtmlPageDom
phpQuery 是一个基于 jQuery JavaScript 库的服务器端、可链接、CSS3 选择器驱动的文档对象模型 (DOM) API。该库是用 PHP5 编写的,并提供了额外的命令行界面 (CLI)。
这被描述为“废弃软件和错误:使用风险自负”,但似乎维护最少。
Laminas\Dom 组件(以前称为 Zend_DOM)提供了处理 DOM 文档和结构的工具。目前,我们提供Laminas\Dom\Query了一个使用 XPath 和 CSS 选择器查询 DOM 文档的统一接口。 此软件包被认为是功能完整的,现在处于仅安全维护模式。
Laminas\Dom 组件(以前称为 Zend_DOM)提供了处理 DOM 文档和结构的工具。目前,我们提供Laminas\Dom\Query了一个使用 XPath 和 CSS 选择器查询 DOM 文档的统一接口。
Laminas\Dom\Query
此软件包被认为是功能完整的,现在处于仅安全维护模式。
fDOMDocument 扩展了标准 DOM 以在所有错误情况下使用异常,而不是 PHP 警告或通知。为了方便和简化 DOM 的使用,他们还添加了各种自定义方法和快捷方式。
sabre/xml 是一个包装和扩展 XMLReader 和 XMLWriter 类的库,以创建简单的“xml 到对象/数组”映射系统和设计模式。写入和读取 XML 是单遍的,因此速度很快,并且在大型 xml 文件上需要较少的内存。
FluidXML 是一个 PHP 库,用于使用简洁流畅的 API 操作 XML。它利用 XPath 和流畅的编程模式变得有趣和有效。
构建在 DOM/libxml 之上的好处是您可以立即获得良好的性能,因为您是基于本机扩展的。然而,并不是所有的第 3 方库都走这条路。下面列出了其中一些
用 PHP5+ 编写的 HTML DOM 解析器让您以非常简单的方式操作 HTML! 需要 PHP 5+。 支持无效的 HTML。 使用像 jQuery 一样的选择器在 HTML 页面上查找标签。 在一行中从 HTML 中提取内容。
我一般不推荐这个解析器。代码库很糟糕,解析器本身相当慢且内存不足。并非所有 jQuery 选择器(例如子选择器)都是可能的。任何基于 libxml 的库都应该很容易胜过这一点。
PHPHtmlParser 是一个简单、灵活的 html 解析器,它允许您使用任何 css 选择器(如 jQuery)来选择标签。目标是协助开发需要快速、简单的方法来抓取 html 的工具,无论它是否有效!这个项目最初由 sunra/php-simple-html-dom-parser 支持,但支持似乎已经停止,所以这个项目是我对他以前工作的改编。
同样,我不会推荐这个解析器。由于 CPU 使用率很高,所以速度相当慢。也没有清除已创建 DOM 对象内存的功能。这些问题特别适用于嵌套循环。文档本身不准确且拼写错误,自 2016 年 4 月 14 日起对修复没有任何回应。
您可以使用上面的方法来解析 HTML5,但由于 HTML5 允许的标记,可能会出现一些问题。因此,对于 HTML5,您可能需要考虑使用专用解析器。请注意,这些是用 PHP 编写的,因此与使用低级语言编译的扩展相比,性能会降低,内存使用会增加。
HTML5DOMDocument 扩展了本机 DOMDocument 库。它修复了一些错误并添加了一些新功能。 保留 html 实体(DOMDocument 不保留) 保留无效标签(DOMDocument 不保留) 允许插入将正确部分移动到适当位置的 HTML 代码(头部元素插入头部,主体元素插入正文) 允许使用 CSS 选择器查询 DOM(当前可用:*, tagname, tagname#id, #id, tagname.classname, .classname, tagname.classname.classname2, .classname.classname2, tagname[attribute-selector], [attribute-selector], div, p, div p, div > p, div + p, and p ~ ul.) 添加对 element->classList 的支持。 添加对 element->innerHTML 的支持。 添加对 element->outerHTML 的支持。
HTML5DOMDocument 扩展了本机 DOMDocument 库。它修复了一些错误并添加了一些新功能。
*
tagname
tagname#id
#id
tagname.classname
.classname
tagname.classname.classname2
.classname.classname2
tagname[attribute-selector]
[attribute-selector]
div, p
div p
div > p
div + p
p ~ ul
HTML5 是完全用 PHP 编写的符合标准的 HTML5 解析器和编写器。它稳定并在许多生产网站中使用,下载量超过 500 万次。 HTML5 提供以下功能。 HTML5 序列化器 支持 PHP 命名空间 作曲家支持 基于事件的(类 SAX)解析器 DOM 树构建器 与 QueryPath 的互操作性 在 PHP 5.3.0 或更高版本上运行
HTML5 是完全用 PHP 编写的符合标准的 HTML5 解析器和编写器。它稳定并在许多生产网站中使用,下载量超过 500 万次。
HTML5 提供以下功能。
最后也是最不推荐的,您可以使用正则表达式从 HTML 中提取数据。通常不鼓励在 HTML 上使用正则表达式。
您在网络上找到的大多数与标记匹配的片段都很脆弱。在大多数情况下,它们只适用于非常特殊的 HTML 片段。微小的标记更改,例如在某处添加空格,或添加或更改标记中的属性,可能会使 RegEx 在编写不正确时失败。在 HTML 上使用 RegEx 之前,您应该知道自己在做什么。
HTML 解析器已经知道 HTML 的语法规则。必须为您编写的每个新 RegEx 教授正则表达式。RegEx 在某些情况下很好,但这实际上取决于您的用例。