如何在 PHP 中解析和处理 HTML/XML?

2024-05-02

如何解析 HTML/XML 并从中提取信息?


Answer recommended by PHP /collectives/php Collective

原生 XML 扩展

我更喜欢使用其中之一原生 XML 扩展 https://php.net/manual/en/refs.xml.php因为它们与 PHP 捆绑在一起,通常比所有第 3 方库更快,并为我提供了对标记所需的所有控制。

DOM https://php.net/manual/en/book.dom.php

DOM 扩展允许您使用 PHP 5 通过 DOM API 操作 XML 文档。它是 W3C 文档对象模型核心级别 3 的实现,这是一个平台和语言中立的接口,允许程序和脚本动态访问和更新文件的内容、结构和风格。

DOM 能够解析和修改现实世界(损坏的)HTML,它可以做到XPath 查询 http://schlitt.info/opensource/blog/0704_xpath.html。它是基于libxml http://xmlsoft.org/html/libxml-HTMLparser.html.

使用 DOM 需要一些时间才能提高工作效率,但在我看来,这段时间是非常值得的。由于 DOM 是一个与语言无关的接口,您会发现多种语言的实现,因此如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的 DOM API。

如何使用 DOM 扩展已在 StackOverflow 上,所以如果您选择使用它,您可以确定您遇到的大多数问题都可以通过搜索/浏览 Stack Overflow 来解决。

A 基本用法示例 https://stackoverflow.com/a/3820783 and a 一般概念概述 https://stackoverflow.com/a/4983721可以在其他答案中找到。

XML阅读器 https://php.net/manual/en/book.xmlreader.php

XMLReader 扩展是一个 XML 拉式解析器。阅读器充当文档流上向前移动的光标,并在途中的每个节点处停止。

XMLReader 与 DOM 一样,基于 libxml。我不知道如何触发 HTML 解析器模块,因此使用 XMLReader 解析损坏的 HTML 可能不如使用 DOM 强大,在 DOM 中您可以明确地告诉它使用 libxml 的 HTML 解析器模块。

A 基本用法示例 https://stackoverflow.com/a/3299140可以在另一个答案中找到。

XML解析器 https://php.net/manual/en/book.xml.php

此扩展允许您创建 XML 解析器,然后为不同的 XML 事件定义处理程序。每个 XML 解析器还有一些可以调整的参数。

XML Parser 库也基于 libxml,并实现了SAX http://en.wikipedia.org/wiki/Simple_API_for_XML样式 XML 推送解析器。对于内存管理来说,它可能是比 DOM 或 SimpleXML 更好的选择,但比 XMLReader 实现的拉解析器更难使用。

简单XML https://php.net/manual/en/book.simplexml.php

SimpleXML 扩展提供了一个非常简单且易于使用的工具集,用于将 XML 转换为可以使用普通属性选择器和数组迭代器处理的对象。

当您知道 HTML 是有效的 XHTML 时,SimpleXML 是一个选项。如果您需要解析损坏的 HTML,甚至不要考虑 SimpleXml,因为它会令人窒息。

A 基本用法示例 https://stackoverflow.com/a/4906459是可用的,并且有PHP 手册中有很多其他示例 https://php.net/manual/en/simplexml.examples-basic.php.


3rd 方库(基于 libxml)

如果您更喜欢使用第 3 方库,我建议使用实际使用的库DOM http://php.net/manual/en/book.dom.php/libxml http://xmlsoft.org/下面而不是字符串解析。

FluentDom https://github.com/ThomasWeinert/FluentDOM

FluentDOM 为 PHP 中的 DOMDocument 提供了类似 jQuery 的流畅 XML 接口。选择器是用 XPath 或 CSS 编写的(使用 CSS 到 XPath 转换器)。当前版本扩展了 DOM 实现标准接口并添加了 DOM Living Standard 的功能。 FluentDOM 可以加载 JSON、CSV、JsonML、RabbitFish 等格式。可以通过 Composer 安装。

HtmlPageDom https://github.com/wasinger/htmlpagedom

Wa72\HtmlPageDom是一个用于轻松操作 HTML 的 PHP 库 使用 DOM 的文档。这个需要Symfony2 的 DomCrawler 成分 https://github.com/symfony/DomCrawler用于遍历 DOM 树并通过添加操作方法来扩展它 HTML 文档的 DOM 树。

phpQuery https://github.com/electrolinux/phpquery

phpQuery 是一个服务器端、可链接、CSS3 选择器驱动的文档对象模型 (DOM) API,基于 jQuery JavaScript 库。 该库是用 PHP5 编写的,并提供额外的命令行界面 (CLI)。

这被描述为“废弃软件和错误:使用时需要您自担风险”,但似乎维护程度很低。

椎板域 https://docs.laminas.dev/laminas-dom/

Laminas\Dom 组件(以前称为 Zend_DOM)提供了用于处理 DOM 文档和结构的工具。目前,我们提供Laminas\Dom\Query,它提供了一个统一的接口,用于利用 XPath 和 CSS 选择器查询 DOM 文档。

该软件包被认为是功能完整的,现在处于仅安全维护模式。

fDOM文档 http://github.com/theseer/fDOMDocument

fDOMDocument 扩展了标准 DOM,以在所有错误情况下使用异常,而不是 PHP 警告或通知。为了方便和简化 DOM 的使用,他们还添加了各种自定义方法和快捷方式。

军刀/xml http://sabre.io/xml/

sabre/xml 是一个库,它包装并扩展了 XMLReader 和 XMLWriter 类,以创建简单的“xml 到对象/数组”映射系统和设计模式。写入和读取 XML 是单遍的,因此速度很快,并且在大型 xml 文件上需要的内存较少。

FluidXML https://github.com/servo-php/fluidxml

FluidXML 是一个 PHP 库,用于通过简洁流畅的 API 来操作 XML。 它利用 XPath 和流畅的编程模式,既有趣又有效。


3rd-Party(不基于 libxml)

基于 DOM/libxml 构建的好处是,您可以立即获得良好的性能,因为您基于本机扩展。然而,并非所有第三方库都走这条路。下面列出了其中一些

PHP 简单 HTML DOM 解析器 https://simplehtmldom.sourceforge.io/docs/1.9/index.html

  • 用 PHP5+ 编写的 HTML DOM 解析器可让您以非常简单的方式操作 HTML!
  • 需要 PHP 5+。
  • 支持无效的 HTML。
  • 使用选择器在 HTML 页面上查找标签,就像 jQuery 一样。
  • 在一行中从 HTML 中提取内容。

我一般不推荐这个解析器。代码库很糟糕,解析器本身相当慢并且占用内存。并非所有 jQuery 选择器(例如子选择器 https://api.jquery.com/child-selector/)是可能的。任何基于 libxml 的库都应该轻松超越这一点。

PHP Html 解析器 https://github.com/paquettg/php-html-parser

PHPHtmlParser 是一个简单、灵活的 html 解析器,它允许您使用任何 css 选择器(如 jQuery)选择标签。我们的目标是协助开发需要快速、简单的方法来抓取 html 的工具,无论它是否有效!这个项目最初是由 sunra/php-simple-html-dom-parser 支持的,但是支持似乎已经停止了,所以这个项目是我对他之前工作的改编。

再说一次,我不会推荐这个解析器。 CPU 使用率高时速度相当慢。也没有清除创建的 DOM 对象内存的功能。这些问题在嵌套循环中尤其严重。该文档本身不准确且拼写错误,自 2016 年 4 月 14 日以来没有任何修复响应。


HTML 5

您可以使用上面的内容来解析 HTML5,但是可能会有怪癖 https://stackoverflow.com/q/4029341由于 HTML5 允许的标记。因此,对于 HTML5,您可能需要考虑使用专用解析器。请注意,这些是用 PHP 编写的,因此与使用较低级别语言编译的扩展相比,性能较慢且内存使用量增加。

HTML5Dom文档 https://github.com/ivopetkov/html5-dom-document-php/

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 https://github.com/Masterminds/html5-php

HTML5 是完全用 PHP 编写的符合标准的 HTML5 解析器和编写器。它很稳定并在许多生产网站中使用,下载量远远超过 500 万次。

HTML5 提供以下功能。

  • HTML5 序列化器
  • 支持 PHP 命名空间
  • 作曲家支持
  • 基于事件(类似 SAX)的解析器
  • DOM 树构建器
  • 与 QueryPath 的互操作性
  • 在 PHP 5.3.0 或更高版本上运行

常用表达

最后和最不推荐的,您可以使用以下命令从 HTML 中提取数据常用表达 https://stackoverflow.com/search?q=regular%20expression%20tutorials。一般来说,不鼓励在 HTML 上使用正则表达式。

您在网络上找到的大多数用于匹配标记的片段都很脆弱。在大多数情况下,它们仅适用于非常特定的 HTML 片段。微小的标记更改(例如在某处添加空格,或者在标记中添加或更改属性)可能会导致正则表达式在编写不正确时失败。在 HTML 上使用 RegEx 之前,您应该知道自己在做什么。

HTML 解析器已经知道 HTML 的语法规则。必须为您编写的每个新正则表达式教授正则表达式。正则表达式在某些情况下很好,但这实际上取决于您的用例。

You 可以编写更可靠的解析器 https://stackoverflow.com/a/4234491,但是写一个完整可靠当上述库已经存在并且在这方面做得更好时,使用正则表达式的自定义解析器是浪费时间。

另请参阅解析 Html 的克苏鲁方式 http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html


Books

如果你想花点钱的话可以看看

  • PHP 架构师使用 PHP 进行网页抓取的指南 http://www.phparch.com/books/phparchitects-guide-to-web-scraping-with-php

我不隶属于 PHP 架构师或作者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PHP 中解析和处理 HTML/XML? 的相关文章