如何解析和处理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解析器
我通常不推荐这个解析器。 代码库很糟糕,解析器本身速度很慢,内存很大。 并非所有的jQuery选择器(如子选择器)都是可能的。 任何基于libxml的库都应该轻松胜过这一点。
PHP的HTML解析器
PHPHtmlParser是一个简单,灵活的html解析器,它允许您使用任何css选择器(如jQuery)来选择标签。 目标是协助开发需要快速,简单的方法来废除HTML的工具,无论它是否有效! 这个项目最初由sunra / php-simple-html-dom-parser支持,但支持似乎停止了,所以这个项目是我对他以前的工作的改编。
再次,我不会推荐这个解析器。 CPU使用率高,速度很慢。 也没有函数来清除已创建的DOM对象的内存。 这些问题在嵌套循环中特别突出。 文档本身不准确并且拼写错误,自16年4月14日以来没有回复修复。
加农
从未使用它。 不知道它是否有好处。
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架构师或作者。
尝试简单的HTML DOM解析器
例子:
如何获取HTML元素:
// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');
// Find all images
foreach($html->find('img') as $element)
echo $element->src . '<br>';
// Find all links
foreach($html->find('a') as $element)
echo $element->href . '<br>';
如何修改HTML元素:
// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
$html->find('div', 1)->class = 'bar';
$html->find('div[id=hello]', 0)->innertext = 'foo';
echo $html;
从HTML中提取内容:
// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;
刮刮板:
// Create DOM from URL
$html = file_get_html('http://slashdot.org/');
// Find all article blocks
foreach($html->find('div.article') as $article) {
$item['title'] = $article->find('div.title', 0)->plaintext;
$item['intro'] = $article->find('div.intro', 0)->plaintext;
$item['details'] = $article->find('div.details', 0)->plaintext;
$articles[] = $item;
}
print_r($articles);
只需使用DOMDocument-> loadHTML()并完成它。 libxml的HTML解析算法相当好,而且速度很快,与流行的观点相反,它不会歪曲格式错误的HTML。
链接地址: http://www.djcxy.com/p/777.html