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

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

答案


原生XML扩展

我更喜欢使用原生XML扩展之一,因为它们与PHP捆绑在一起,通常比所有第三方库更快,并且给我所需的所有控制权。

DOM

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

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

需要一段时间才能提高DOM的效率,但那个时间值得IMO考虑。由于DOM是一个与语言无关的接口,所以你会发现许多语言的实现,所以如果你需要改变你的编程语言,那么很可能你已经知道如何使用该语言的DOM API了。

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

如何使用DOM扩展已经在StackOverflow中得到了广泛的介绍,所以如果您选择使用它,您可以确定您遇到的大部分问题都可以通过搜索/浏览堆栈溢出来解决。

XMLReader的

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

与DOM类似,XMLReader基于libxml。我不知道如何触发HTML解析器模块,因此使用XMLReader解析断开的HTML可能不如使用DOM,因为它可以明确地告诉它使用libxml的HTML解析器模块。

使用php获取来自h1标签的所有值时可以找到一个基本用法示例

XML解析器

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

XML解析器库也基于libxml,并实现了SAX风格的XML推送解析器。对于内存管理来说,这可能是比DOM或SimpleXML更好的选择,但与XMLReader实现的pull语法分析器相比,将更难以使用。

SimpleXML的

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

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

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


第三方库(基于libxml)

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

FluentDom

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

HtmlPageDom

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

phpQuery(未更新多年)

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

另见:https : //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的使用。

军刀/ XML

saber / xml是一个包装和扩展XMLReader和XMLWriter类的库,以创建一个简单的“xml to object / array”映射系统和设计模式。编写和读取XML是单向传递的,因此可以很快并且需要较大的xml文件内存。

FluidXML

FluidXML是一个用简洁流畅的API操纵XML的PHP​​库。它充分利用了XPath和流畅的编程模式,使其变得有趣和有效。


第三方(不是基于libxml的)

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

PHP简单的HTML DOM解析器

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

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

PHP的HTML解析器

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

再次,我不会推荐这个解析器。CPU使用率高,速度很慢。也没有函数来清除已创建的DOM对象的内存。这些问题在嵌套循环中特别突出。文档本身不准确并且拼写错误,自16年4月14日以来没有回复修复。

加农

  • 通用标记器和HTML / XML / RSS DOM解析器
    • 能够操纵元素及其属性
    • 支持无效的HTML和UTF8
  • 可以对元素执行类似高级CSS3的查询(如jQuery – 支持的命名空间)
  • 一个HTML美化器(如HTML Tidy)
    • 减少CSS和Javascript
    • 排序属性,更改字符大小写,正确缩进等。
  • 扩展
    • 使用基于当前字符/标记的回调来解析文档
    • 操作以较小的函数分隔,便于覆盖
  • 快速和简单

从未使用它。不知道它是否有好处。


HTML 5

您可以使用上述方法解析HTML5,但由于HTML5允许使用标记,因此可能会出现怪癖。所以对于HTML5你想考虑使用专用的解析器,比如

html5lib

基于WHATWG HTML5规范的HTML解析器的Python和PHP实现,以实现与主要桌面Web浏览器的最大兼容性。

一旦HTML5完成,我们可能会看到更多的专用解析器。W3也有一篇标题为How-To for HTML 5解析的博文,值得一读。


网页服务

如果你不想编程PHP,你也可以使用Web服务。一般来说,我发现这些功能很少,但这只是我和我的用例。

YQL

YQL Web服务使应用程序能够查询,过滤和组合来自互联网上不同来源的数据。YQL语句具有SQL类似的语法,任何具有数据库经验的开发人员都会熟悉。

ScraperWiki

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


常用表达

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

大部分你会在网上找到的匹配标记的片段都很脆弱。在大多数情况下,他们只是为特定的HTML工作。微小的标记更改(如在某处添加空白处)或添加​​或更改标记中的属性会导致RegEx在写入不正确时失败。在HTML上使用RegEx之前,您应该知道自己在做什么。

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

可以编写更可靠的解析器,但使用正则表达式编写完整且可靠的定制解析器会浪费时间,因为前面提到的库已经存在并在此方面做得更好。

另请参阅解析Html The Cthulhu Way


图书

如果你想花一些钱,看看

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

添加评论

友情链接:蝴蝶教程