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

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

参考方案

本机XML扩展

我更喜欢使用native XML extensions之一,因为它们与PHP捆绑在一起,通常比所有第三方库都快,并为我提供了所需的所有标记控制权。

DOM

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

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

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

可以在Grabbing the href attribute of an A element中找到基本用法示例,并在DOMDocument in php中找到常规概念概述。

How to use the DOM extension has been covered extensively on StackOverflow,因此,如果您选择使用它,可以确保可以通过搜索/浏览堆栈溢出来解决大多数遇到的问题。

XMLReader

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

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

基本用法示例可以在getting all values from h1 tags using php中找到

XML Parser

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

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

SimpleXml

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

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

可以在A simple program to CRUD node and node values of xml file找到一个基本的用法示例,其中有lots of additional examples in the PHP Manual。

第三方库(基于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
使用It的文档需要DomCrawler from Symfony2
components才能遍历
DOM树并通过添加操作DOM的方法对其进行扩展
HTML文档树。

phpQuery(多年未更新)

phpQuery是服务器端可链接的CSS3选择器驱动的文档对象模型(DOM)API,它基于用PHP5编写的jQuery JavaScript库,并提供了附加的命令行界面(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的使用。

sabre/xml

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

FluidXML

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

第三方(不是基于libxml的)

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

PHP Simple HTML DOM Parser

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

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

PHP Html Parser

PHPHtmlParser是一个简单,灵活的html解析器,它使您可以使用任何CSS选择器(例如jQuery)来选择标签。目标是协助开发工具,这些工具需要快速,简便的方式来废弃html,无论它是否有效!该项目最初由sunra / php-simple-html-dom-parser支持,但该支持似乎已停止,因此该项目是我对他先前工作的改编。

同样,我不建议使用此解析器。 CPU使用率很高时,速度相当慢。也没有清除创建的DOM对象的内存的功能。这些问题在嵌套循环中尤为严重。文档本身不准确且拼写错误,自16年4月14日以来未对修复程序做出任何回应。

Ganon

通用标记器和HTML / XML / RSS DOM解析器

能够操纵元素及其属性
支持无效的HTML和UTF8

可以对元素执行类似CSS3的高级查询(例如jQuery-支持名称空间)
HTML美化器(如HTML Tidy)

缩小CSS和Javascript
排序属性,更改字符大小写,正确缩进等

可扩展的

使用基于当前字符/令牌的回调解析文档
将操作分成较小的功能,以便于覆盖

快速简便

没用过。无法判断是否有好处。

HTML 5

您可以使用上面的内容来解析HTML5,但由于标记HTML5允许使用there can be quirks。因此,对于HTML5,您需要考虑使用专用的解析器,例如

html5lib

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

HTML5完成后,我们可能会看到更多专用的解析器。 W3上还有一个标题为How-To for html 5 parsing的博客文章值得一看。

网页服务

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

ScraperWiki。

ScraperWiki的外部界面允许您以想要在Web或您自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮板状态的信息。

常用表达

最后建议,您可以使用regular expressions从HTML提取数据。通常,不建议在HTML上使用正则表达式。

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

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

您can write more reliable parsers,但是当上述库已经存在并且在此方面做得更好时,编写带有正则表达式的完整而可靠的自定义解析器会浪费时间。

另请参见Parsing Html The Cthulhu Way

图书

如果你想花一些钱,看看

PHP Architect's Guide to Webscraping with PHP

我不隶属于PHP Architect或作者。

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP mysqli获取查询返回的第一行的值 - php

我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

更改默认的URL PHP - php

如何更改默认网址。例如www.example.com/index.php-> www.example.com现在,我要将其设置为www.example.com/test.php。我应该在php.ini中进行更改吗? 参考方案 假设您正在使用apache,则可以通过DirectoryIndex指令执行此操作。Check out the docs。