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

2023-11-22

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


Answer recommended by PHP Collective

原生 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 架构师使用 PHP 进行网页抓取的指南

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

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

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

  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 从 .phar 存档中提取文件

    对于 Phar 文件 我完全错过了一些东西 我正在安装一个需要 phpunit pdepend 和其他依赖项的项目 我将它们作为 phar 文件获取 但是 我无法使用命令行工具 php 命令 从中提取文件 我用谷歌搜索了这个问题 但没有发现
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 覆盖控制器 Symfony 3.4/4.0

    我目前正在尝试覆盖 FOSUserBundle 中的控制器 在新的文档中 https symfony com doc 3 4 bundles override html https symfony com doc 3 4 bundles o
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Woocommerce 结账自定义选择字段

    我有以下功能 将选择列表添加到 woo commerce 结账表单中 woocommerce form field airport pickup array type gt select class gt array airport pic
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • HTML 中部分着色的阿拉伯语单词

    我不会说阿拉伯语 但我需要我们网站上对阿拉伯语的具体支持 我需要将部分阿拉伯语单词放在 span 与单词其他部分的风格不同 当我输入两个字符时 and 它们被组合成word 但是当我使用 HTML 标记时 span span 这些字母在输出
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • 避免响应式页面的重复内容

    我目前正在做一个涉及响应式设计的项目 整个布局应该使用HTML和CSS来实现 我知道可以使用 java 脚本将内容从一个列布局移动到另一列布局 而无需复制内容 但是使用 HTML 和 CSS 是否可以实现相同的效果 以下面的例子为例 它会在
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • 为什么 Composer 降级了我的包?

    php composer phar update这样做了 删除了 2 3 0 软件包并安装了整个 2 2 5 Zend Framework php composer phar update Loading composer reposito
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B
  • 使用 powershell 将 XML 转换为特定的 JSON 结构

    需要有关将 xml 转换为特定 json 结构的帮助 XML 看起来像这样
  • FireFox 中的“contenteditable = true”高度问题

    当有空的时候div with contenteditable true CSS contenteditable true border 1px dashed dedede padding 3px HTML div div 在 IE 和 Ch

随机推荐

  • 路径压缩和按等级合并如何相辅相成?

    我一直在阅读有关联合查找问题的内容 两个主要改进是路径压缩和按等级并集 据我了解 按等级并集用于确定如何组合不相交的树 如果我们有两棵不相交的树 T1 和 T2 那么我们将具有较小等级的树的根附加到具有较高等级的树 如果我们不使用路径压缩
  • 联系人中存在联系人

    我有电话号码 有没有办法检查设备的联系人数据库中是否存在电话号码 根据这一点 我需要在我的应用程序中进一步前进 请提出建议 或者如果有人可以提供示例代码片段 请提供 下面是我写的代码 public boolean contactExists
  • HP Fortify——注释方法参数

    我正在尝试消除 Java 应用程序的 HP Fortify 扫描中的误报 此方法会导致 侵犯隐私 问题 PrintWriter 是 servlet 响应 private void writeOutput String passwordRul
  • 使用 jQuery UI 同时对多个项目进行排序

    我正在尝试设置一种方法来同时对多个项目进行排序jQuery UI 的可排序插件 我提出了一个部分解决方案 其中选中的项目随拖动一起移动 但我无法让它们全部移动位置 这是我所拥有的 http jsbin com ecela 我需要添加什么才能
  • 类型错误:“设置”对象不支持索引

    我刚刚在 Python 3 5 中做了一些随机的事情 我利用 15 分钟的空闲时间想出了这个 a a b c d e f g h i j k l m n o p q r s t u v w x y z len a len a list li
  • 根据 React 中的 props 名称动态导入

    根据 React 中的 props 名称动态导入 import a b c from some package theme should not import everything here const MyComp theme other
  • 转换期间的一般错误:找不到合适的 ClassLoader 进行抓取

    我尝试过下面的代码 Grapes Grab org hsqldb hsqldb 2 0 0 GrabConfig systemClassLoader true initContextClassLoader true import groov
  • 如何摆脱 NDK 编译器警告:“APP_PLATFORM 更大..”和“无效包”

    我有以下 Application mk APP PLATFORM android 9 APP STL gnustl static APP CPPFLAGS frtti fexceptions O2 mfpu neon mfloat abi
  • 简单的ListView数据绑定

    我正在尝试显示数据ListView使用 WPF 和 C 我对所看到的不同示例和方法感到困惑 我正在寻找一个与我的程序类似的完整工作示例 或者使其工作的先决条件列表 如果我能够仅显示我的集合中的 1 行数据 我会很高兴 目前 列表视图不显示任
  • [UWP][XAML] ListView 子项不使用全宽

    我正在尝试显示绑定项目的列表 我已将数据模板自定义为网格 我希望右列 具有固定宽度 粘在屏幕的右侧 而第一列我想填充剩余空间 通常这工作正常 但是当我将此网格放入 ListView 中时 行为似乎发生了变化 下面是我的ListView代码
  • OpenID 领域是否必须是网站的基本 URL?

    作为延续这个问题 我在使用 dotnetopenauth 时遇到了问题 基本上 我想知道 RP 中指定的领域是否必须是应用程序的实际基本 URL 那是 http localhost 1903 鉴于现有的架构 很难删除重定向 我尝试将领域设置
  • 为什么 select SCOPE_IDENTITY() 返回小数而不是整数?

    所以我有一个以标识列作为主键的表 因此它是一个整数 那么 为什么SCOPE IDENTITY 总是向我的 C 应用程序返回十进制值而不是 int 这真的很烦人 因为十进制值不会在 C 中隐式转换为整数 这意味着我现在必须重写一堆东西并有很多
  • 如何处理 Web 应用程序中的并发更改?

    以下是我想在 Web 应用程序中执行的两个潜在工作流程 变化1 用户发送请求 服务器读取数据 服务器修改数据 服务器保存修改后的数据 变化2 用户发送请求 服务器读取数据 服务器向用户发送数据 用户发送带有修改的请求 服务器保存修改后的数据
  • 如何在 RecyclerView 中使用 GridLayoutAnimation?

    我正在尝试用新的 RecyclerView 使用 GridLayoutManager 替换我的 GridView 但它似乎不能很好地应对 gridLayoutAnimation ClassCastException LayoutAnimat
  • 将 $routeProvider 与 $stateProvider 一起使用

    一开始我只是使用 routeProvider 如下 它给了我我想要的东西 angular module angularProject angularProject filters angularProject services angula
  • Spring-Test-MVC / MockServletContext - 测试中内容为空,但在 Tomcat 上工作

    我们正在尝试为我们的 Spring MVC Web 应用程序设置 Spring Test MVC 我们开始使用 freemarker 一切都很好 但我们决定不这样做 现在正在尝试使用 JSP 来设置它 当测试应用程序部署在 Tomcat 上
  • IE8 上多帧 JS 的完整调用堆栈

    当 Internet Explorer 8 上的 JavaScript 发生异常时 我需要获取完整的调用堆栈 函数调用可能发生在数量较大的帧之间 将日志发送给开发人员所需的调用堆栈 我无法使用调试器 因为最终用户不必处理这个问题 当前的 J
  • 如何使用DataContext.ExecuteCommand并获取执行的存储过程返回值?

    在c 项目中 我调用存储过程如下 System Data Linq DataContext dataContext MembershipContext GetContext connectionString int returnValue
  • C++ 删除字符串对象

    我的 C 程序中有一个字符串对象 声明如下 string str 我已经将一些数据复制到其中并做了一些操作 现在我想从内存中删除str对象 我无法使用删除运算符 因为 str 不是指针 如何从内存中删除该对象以回收分配给它的内存 谢谢 拉凯
  • 如何在 PHP 中解析和处理 HTML/XML?

    如何解析 HTML XML 并从中提取信息 Answer recommended by PHP Collective 原生 XML 扩展 我更喜欢使用其中之一原生 XML 扩展因为它们与 PHP 捆绑在一起 通常比所有第 3 方库更快 并为