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

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

本机xml扩展

我更喜欢使用一种原生XML扩展,因为它们与PHP捆绑在一起,通常比所有第三方LIB都要快,并为我提供了对标记所需的所有控制

dom

DOM扩展允许您使用PHP5通过DOM API对XML文档进行操作。它是W3C文档对象模型核心级别3的实现,是一个平台和语言中立的界面,允许程序和脚本动态访问和更新文档的内容、结构和样式

DOM能够解析和修改真实世界(破碎的)HTML,并且可以执行XPath查询。它基于libxml

使用DOM需要一些时间才能提高效率,但在我看来,这是非常值得的。因为DOM是一个与语言无关的接口,您可以在许多语言中找到实现,因此如果您需要更改编程语言,那么您可能已经知道如何使用该语言的DOM API

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

关于如何使用DOM扩展,StackOverflow已经做了大量的介绍,因此,如果您选择使用它,您可以肯定,您遇到的大多数问题都可以通过搜索/浏览Stack Overflow来解决

xmlreader-7j8y

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

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

可以在使用php从h1标记获取所有值时找到一个基本用法示例

xml解析器

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

XML解析器库也基于libxml,并实现了SAX风格的XML推式解析器。对于内存管理来说,它可能比DOM或SimpleXML更好,但与XMLReader实现的pull解析器相比,它更难使用

simplexml

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

当您知道HTML是有效的XHTML时,SimpleXML是一个选项。如果需要解析损坏的HTML,不要考虑SimeXML,因为它会哽住。

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


第三方库(基于libxml)

如果您更喜欢使用第三方库,我建议使用一个实际上在下面使用DOM/libxml的库,而不是字符串解析

fluentdom-repo-mmnx

FluentDOM为PHP中的DOMDocument提供了类似于jQuery的FluentXML接口。选择器是用XPath或CSS编写的(使用CSS到XPath转换器)。当前版本扩展了DOM实现的标准接口,并添加了来自DOM生活标准的特性。FluentDOM可以加载JSON、CSV、JsonML、RabbitFish等格式。可以通过Composer安装

htmlpagedom-wf22

Wa72\HtmlPageDom是一个易于操作HTML的PHP库
使用DOM的文档。它需要来自Symfony2的DomCrawler
用于遍历的组件
DOM树,并通过添加用于操作
HTML文档的DOM树

phpquery(多年未更新)

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

另见:https://github.com/electrolinux/phpquery

zend_dom-atxa

Zend_Dom提供了用于处理Dom文档和结构的工具。目前,我们提供了Zend_Dom_查询,它为使用XPath和CSS选择器查询Dom文档提供了统一的接口

查询路径

QueryPath是一个用于处理XML和HTML的PHP库。它不仅设计用于本地文件,还设计用于web服务和数据库资源。它实现了jQuery接口的大部分功能(包括CSS样式选择器),但它经过了大量的服务器端使用调优。可以通过Composer安装

fdomdocument hmmf

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

sabre/xml

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

fluidxml

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


第三方(不基于libxml)

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

php简单html dom解析器

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

我通常不推荐使用这种解析器。代码库很糟糕,解析器本身速度很慢,内存不足。并非所有jQuery选择器(如子选择器)都是可能的。任何基于libxml的库都应该能够轻松地超越这一点

php html解析器

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

同样,我不推荐使用这种解析器。它相当慢,CPU使用率很高。也没有清除已创建DOM对象内存的功能。这些问题尤其适用于嵌套循环。文档本身不准确,拼写错误,自2016年4月14日以来没有对修复的响应

加农

  • 通用标记器和HTML/XML/rssdom解析器
  • 操作元素及其属性的能力
  • 支持无效的HTML和UTF8
    
  • 可以对元素执行类似于CSS3的高级查询(如jQuery——支持的名称空间)
    
  • HTML美化器(如HTML Tidy)
  • 缩小CSS和Javascript
  • 排序属性、更改字符大小写、更正缩进等。
    
  • 可扩展
  • 使用基于当前字符/令牌的回调解析文档
    
  • 操作以较小的函数分隔,便于重写
    
  • 快捷

从来没用过。看不出有什么好处


html 5

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

html5lib

基于WHATWG HTML5规范的HTML解析器的Python和PHP实现,最大限度地与主要桌面web浏览器兼容

一旦HTML5最终确定,我们可能会看到更多的专用解析器。W3的博客文章《如何进行HTML5解析》也值得一看


webservices

如果您不想编写PHP,也可以使用Web服务。一般来说,我发现这些工具的实用性很小,但这只是我和我的用例

scraperwiki

ScraperWiki的外部接口允许您以希望在web或您自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮板状态的信息


正则表达式

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

在web上找到的大多数与标记匹配的代码片段都是脆弱的。在大多数情况下,他们只为一个非常特殊的HTM工作

发表评论