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

PHP

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

原生 XML 扩展

我更喜欢使用原生 XML 扩展中的一种,因为它们与 PHP 捆绑在一起,通常比所有第三方库都快,并且全都给了我对标记的控制。

DOM

DOM 扩展使你可以通过带有 DOM API 的 PHP 5 通过 XML 文档进行操作。它是 W3C 文档对象模型核心级别3的实现,它是一种平台和语言独立的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。

DOM 能够解析和修改损坏的 HTML,并且可以执行 XPath 查询。它基于 libxml

使用 DOM 需要花一些时间,但是它值得。 由于 DOM 是与语言无关的接口,因此你会发现许多语言的实现,因此,如果你需要更改编程语言,那么你很可能已经知道如何使用该语言的 DOM API。

一个基本的用法示例可以在抓取 A 元素的 href 属性查看,一般概念概述可在 php 中的 DOMDocument 中找到。

如何使用 DOM 扩展已在 StackOverflow 上进行了广泛介绍,因此,如果你选择使用它,则可以确定你遇到的大多数问题都可以通过搜索/浏览 StackOverflow 解决。

XMLReader

XMLReader 扩展是 XML 提取解析器。 读取流充当光标,在文档流上前进并在途中的每个节点处停止。

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

一个基本的用法示例可以在使用 php 从 h1 标签中获取所有值找到。

XML Parser

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

XML 解析器也基于 libxml 库,并实现了一种 SAX 样式的 XML 推送解析器。 对于内存管理而言,与 DOM 或 SimpleXML 相比,它可能是更好的选择,但与 XMLReader 实现的请求解析器相比,使用起来更加困难。

SimpleXml

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

当你知道 HTML 是有效的 XHTML 时,可以选择 SimpleXML。 如果你需要解析损坏的 HTML,甚至不用考虑 SimpleXml,因为它会阻塞

一个基本的用法示例可以在 一个 简单的 CRUD xml 文件的节点和节点值程序中找到,并且 PHP 手册中还有很多其他示例


第三方库(基于 libxml )

如果你更喜欢使用第三方库,我建议你使用 DOM/libxml,而不是字符串解析。

FluentDom - Repo

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

HtmlPageDom

Wa72\HtmlPageDom 是一个 PHP 库,可使用它轻松处理 HTML 文档。它需要 Symfony2 组件中的 DomCrawler来遍历 DOM 树,并通过添加用于操作的方法来扩展 HTML 文档的 DOM 树。

phpQuery (多年未更新)

phpQuery 是服务器端、可链接的,由 CSS3 选择器驱动的文档对象模型(DOM)API,它基于用 PHP 5 编写的 jQuery JavaScript 库,并提供了附加的命令行界面(CLI)。

另请参阅: github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom 提供了用于处理 DOM 文档和结构的工具。 当前,我们提供的 Zend_Dom_Query,它提供了一个统一的接口,用于同时使用 XPath 和 CSS 选择器查询 DOM 文档。

QueryPath

QueryPath 是一个用于处理 XML 和 HTML 的 PHP ​​库。 它不仅可以与本地文件一起使用,还可以与 Web 服务和数据库资源一起使用。 它实现了许多 jQuery 接口(包括 CSS 样式选择器),但为服务器端使用做了很大的调整。 可以通过 Composer 安装。

fDOMDocument

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

sabre/xml

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

FluidXML

FluidXML 是一个 PHP 库,使用简洁流畅的 API 来处理 XML。 它利用 XPath ,使流畅的编程模式变得有趣且有效。


第三方 (不基于 libxml)

基于 DOM/libxml 的好处是,由于你基于自带的扩展,因此可以立即获得良好的性能。 但是,并非所有第3方库都遵循这条路线。下面列出其中一些。

PHP 简单 HTML DOM 解析器

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

我通常不建议使用此解析器。它的代码库太可怕了,解析器本身也很慢并且占用大量内存。并不是所有的 jQuery 选择器(例如child 选择器)都是可行的。任何基于 libxml的库都应该轻易胜过这个。

PHP Html 解析器

PHPHtmlParser 是一个简单,灵活的 html 解析器,它使你可以使用任何 CSS 选择器(如 jQuery)来选择标签。它的目标是帮助开发工具,这些工具需要一种快速、简单的方法来废弃 html,不管它是否有效!这个项目最初是由 sunra/php-simple-html-dom-parser 支持的,但是似乎已经停止了,所以这个项目是我对他以前工作的改编。

同样,我不推荐使用这个解析器。它运行速度很慢,CPU 占用率很高。也没有清除已创建 DOM 对象的内存的函数。这些问题特别适用于嵌套循环。文档本身是不准确的,而且拼写错误,自4月14日以来没有对修复进行回复。

Ganon

  • 一种通用的标记器和 HTML/XML/RSS DOM 解析器
    • 操作元素及其属性的能力
    • 支持无效的 HTML 和 UTF8
  • 可以对元素执行类似于 css3的高级查询(如 jQuery – 支持命名空间)
  • HTML 美化器(如 htmltidy)
    • 简化 CSS 和Javascript
    • 排序属性、更改字符大小写、更正缩进等。
  • 可扩展的
    • 使用基于当前 字符/token 的回调解析文档
    • 在较小的函数中分离操作以便于重写
  • 快速简便

从没用过。不能告诉你好不好用。


HTML 5

你可以使用上面的方法来解析 HTML5,但是由于 HTML5 允许的标记可能有一些怪癖。所以对于 HTML5,你需要考虑使用一个专用的解析器,比如 html5lib

一个基于 WHATWG HTML5 规范的 HTML 解析器,由 Python 和 PHP 实现,以最大限度地兼容主流桌面 web 浏览器。

一旦 HTML5 最终定稿,我们可能会看到更多专用的解析器。W3 还有一篇博客文章,名为如何解析 HTML5,值得一读。


WebServices

如果你不喜欢编写 PHP,你也可以使用 Web 服务。一般来说,我发现这些工具很少有用,但这仅仅是我使用的情况。

ScraperWiki.

ScraperWiki 的外部接口允许你以你想要的形式提取数据,以便在 web 或你自己的应用程序中使用。你还可以提取关于任何 scraper 的状态的信息。


正则表达式

最后和最不推荐的 ,你可以用正则表达式从 HTML 中提取数据。通常不鼓励在 HTML 中使用正则表达式。

你在网上找到的大多数与标记匹配的代码片段都很脆弱。在大多数情况下,它们只为一个非常特殊的 HTML 片段工作。微小的标记更改,比如在某处添加空格,或者在标记中添加或更改属性,可能会导致正则表达式在未正确编写时失败。在 HTML 中使用 RegEx 之前,你应该知道自己在做什么。

HTML解析器已经知晓 HTML 的语法规则。而正则表达式需要每次新写正则规则时都指导它了解。正则表达式在某些情况下表现很好,但这确实取决于您的用例。

可以编写更可靠的解析器,不过当前面提到的库已经存在并在这方面做得很好时,编写一个 “完善、可靠” 还带有规则匹配的自定义解析器非常耗时间。

另请参阅解析Cthulhu方式的HTML


书籍

如果你想花钱买书,可以看看

PHP使用PHP进行Web架构的架构师指南

我与此书或与其作者没有任何关系。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://stackoverflow.com/questions/3577...

译文地址:https://learnku.com/php/t/53507

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!