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


当前回答

有很多方法:

一般来说:

本机XML扩展:它们与PHP捆绑在一起,通常比所有第三方库都快,并为我提供了对标记所需的所有控制。DOM:DOM能够解析和修改真实世界(损坏的)HTML,并且可以执行XPath查询。它基于libxml。XMLReader:XMLReader与DOM一样,基于libxml。XMLReader扩展是一个XML拉式解析器。读取器充当文档流上前进的光标,并在途中的每个节点处停止XML解析器:此扩展允许您创建XML解析器,然后为不同的XML事件定义处理程序。每个XML解析器也有一些可以调整的参数。它实现了SAX风格的XML推送解析器。简单XML:SimpleXML扩展提供了一个非常简单且易于使用的工具集,用于将XML转换为可以使用普通属性选择器和数组迭代器处理的对象。

第三方库[libxml-based]:

FluentDom-Repo:FluentDom为PHP中的DOMDocument提供了一个类似jQuery的fluent XML接口。它可以加载JSON、CSV、JsonML、RabbitFish等格式。可以通过Composer安装。HtmlPageDom:是一个PHP库,使用它可以方便地操纵HTML文档。它需要Symfony2组件的DomCrawler来遍历DOM树,并通过添加操纵HTML文档的DOM树的方法来扩展它。ZendDOM:Zend_Dom提供了处理Dom文档和结构的工具。目前,他们提供了Zend_Dom_Query,它为使用XPath和CSS选择器查询Dom文档提供了统一的接口。QueryPath:QueryPath是一个用于处理XML和HTML的PHP库。它不仅设计用于本地文件,还设计用于web服务和数据库资源。它实现了大部分jQuery接口(包括CSS样式选择器),但它针对服务器端使用进行了大量调整。可以通过Composer安装。fDOM文档:fDOMDocument扩展了标准DOM,以在所有错误情况下使用异常,而不是PHP警告或通知。为了方便和简化DOM的使用,他们还添加了各种自定义方法和快捷方式。Sabre/XML:ssabre/XML是一个库,它包装并扩展XMLReader和XMLWriter类,以创建一个简单的“XML到对象/数组”映射系统和设计模式。编写和读取XML是一次性的,因此速度很快,对大型XML文件的内存要求很低。FluidXML:FluidXML是一个PHP库,用于使用简洁流畅的API处理XML。它利用XPath和流畅的编程模式,使其变得有趣和有效。

第三方库[不基于libxml]:

PHP简单HTML DOM解析器:一个用PHP5+编写的HTML DOM解析器允许您以非常简单的方式操作HTML,它需要PHP 5+。还支持无效的HTML。它在单行中从HTML中提取内容。代码库很糟糕,而且工作速度很慢。PHPHtmlParser:HPHtmlParser是一个简单、灵活的Html解析器,允许您使用任何CSS选择器(如jQuery)选择标记。目标是帮助开发需要快速、简单的方式来抓取HTML的工具,无论它是否有效。它速度慢,占用了太多CPU电源。Ganon(推荐):通用标记器和HTML/XML/RSS DOM解析器。它具有操纵元素及其属性的能力。它支持无效的HTML和UTF8。它可以对元素执行类似CSS3的高级查询(如jQuery——支持名称空间)。HTML美化器(如HTML Tidy)。精简CSS和Javascript。它对属性进行排序、更改字符大小写、正确缩进等。可扩展。操作分为较小的功能,便于覆盖和快速且易于使用。

Web服务:

如果您不想编写PHP,也可以使用Web服务。ScraperWiki的外部界面允许您以您希望在web或自己的应用程序中使用的形式提取数据。您还可以提取有关任何刮刀状态的信息。

我已经分享了所有的资源,你可以根据自己的口味、用途等进行选择。

其他回答

XML_HTMLMax相当稳定——即使不再维护它。另一种选择是通过HtmlTidy将HTML导入,然后用标准的XML工具解析它。

对于1a和2:我将投票支持新的Symfony Componet类DOMCrawler(DOMCrawler)。此类允许类似于CSS选择器的查询。看看这个演示文稿,看看真实世界的例子:news-of-the-symfony2-world。

该组件设计为独立工作,可以在没有Symfony的情况下使用。

唯一的缺点是它只适用于PHP5.3或更高版本。

简单HTML DOM是一个很棒的开源解析器:

simplehtmldom.sourceforge

它以面向对象的方式处理DOM元素,新的迭代包含了大量不兼容代码。还有一些很棒的函数,如JavaScript中的“find”函数,它将返回该标记名元素的所有实例。

我已经在许多工具中使用了这个,在许多不同类型的网页上测试了它,我认为它非常有用。

注意,这个答案推荐了那些已经废弃了10多年的图书馆。

phpQuery和QueryPath在复制流畅的jQuery API方面非常相似。这也是为什么它们是在PHP中正确解析HTML的两种最简单的方法。

QueryPath示例

基本上,您首先从HTML字符串创建一个可查询的DOM树:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

结果对象包含HTML文档的完整树表示。可以使用DOM方法遍历它。但常见的方法是使用jQuery中的CSS选择器:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

大多数情况下,您希望为->find()使用简单的#id和.class或DIV标记选择器。但您也可以使用XPath语句,这有时会更快。另外,典型的jQuery方法,如->children()和->text(),特别是->attr(),简化了提取正确的HTML片段。(并且已经解码了它们的SGML实体。)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath还允许将新标记注入流(->追加),然后输出并美化更新的文档(->写入HTML)。它不仅可以解析格式错误的HTML,还可以解析各种XML方言(带有名称空间),甚至可以从HTML微格式(XFN、vCard)中提取数据。

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

.

phpQuery还是QueryPath?

一般来说,QueryPath更适合处理文档。而phpQuery还实现了一些伪AJAX方法(仅HTTP请求),以更接近于jQuery。据称,phpQuery通常比QueryPath更快(因为总体特性较少)。

有关差异的更多信息,请参阅tagbyte.org上的wayback机器上的比较

优势

简单可靠易于使用的替代方案->查找(“a img,a object,div a”)正确的数据取消捕获(与正则表达式grepping相比)

我在这里没有提到的一种通用方法是通过Tidy运行HTML,它可以设置为输出保证有效的XHTML。然后可以在上面使用任何旧的XML库。

但对于您的具体问题,您应该看看这个项目:http://fivefilters.org/content-only/--这是Readability算法的一个修改版本,它旨在从页面中提取文本内容(而不是页眉和页脚)。