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