如何解析和处理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架构师使用PHP进行Web浏览的指南
  • 我不隶属于PHP架构师或作者。


    尝试简单的HTML DOM解析器

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

  • 例子:

    如何获取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

    上一篇: How do you parse and process HTML/XML in PHP?

    下一篇: Why is "using namespace std" considered bad practice?