协慌网

登录 贡献 社区

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

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

答案

原生 XML 扩展

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

DOM

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

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

使用 DOM 需要一些时间才能提高效率,但这个时间非常值得 IMO。由于 DOM 是一个与语言无关的接口,因此您可以找到多种语言的实现,因此如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的 DOM API。

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

StackOverflow 上已经广泛介绍了如何使用 DOM 扩展 ,因此如果您选择使用它,您可以确定您遇到的大多数问题都可以通过搜索 / 浏览 Stack Overflow 来解决。

XMLReader 的

XMLReader 扩展是一个 XML pull 解析器。读取器在文档流上作为光标前进,并在途中停在每个节点上。

与 DOM 一样,XMLReader 基于 libxml。我不知道如何触发 HTML Parser 模块,因此使用 XMLReader 解析损坏的 HTML 的可能性可能不如使用 DOM,因为您可以明确告诉它使用 libxml 的 HTML Parser Module。

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

XML 解析器

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

XML Parser 库也基于 libxml,并实现了SAX样式的 XML 推送解析器。它可能是比 DOM 或 SimpleXML 更好的内存管理选择,但是比 XMLReader 实现的 pull 解析器更难以使用。

SimpleXML 的

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

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

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


第三方库(基于 libxml)

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

FluentDom

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

HtmlPageDom

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

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 的使用。

军刀 / XML

saber / xml 是一个包装和扩展 XMLReader 和 XMLWriter 类的库,用于创建一个简单的 “xml 到对象 / 数组” 映射系统和设计模式。编写和读取 XML 是单遍的,因此可以快速并且需要大型 xml 文件的低内存。

FluidXML

FluidXML 是一个 PHP 库,用于通过简洁流畅的 API 来操作 XML。它利用 XPath 和流畅的编程模式,既有趣又有效。


第三方(不是基于 libxml 的)

构建 DOM / libxml 的好处是,您可以获得良好的开箱即用性能,因为您基于本机扩展。但是,并非所有第三方库都沿着这条路线行进。其中一些列在下面

PHP 简单的 HTML DOM 解析器

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

我一般不推荐这个解析器。代码库很糟糕,解析器本身很慢而且内存很耗。并非所有 jQuery 选择器(例如子选择器 )都是可能的。任何基于 libxml 的库都应该比这更容易。

PHP Html 解析器

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

同样,我不推荐这个解析器。 CPU 使用率很高,速度相当慢。还没有清除已创建 DOM 对象的内存的功能。这些问题尤其适用于嵌套循环。文档本身不准确且拼写错误,自 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 parsing ,值得一试。


网页服务

如果您不想编写 PHP,也可以使用 Web 服务。一般来说,我发现这些实用程序的效用很小,但这只是我和我的用例。

YQL

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

ScraperWiki

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


常用表达

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

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

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

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

另见Parsing Html The Cthulhu Way


图书

如果你想花一些钱,看看吧

我不隶属于 PHP Architect 或作者。

尝试简单的 HTML DOM 解析器

  • 用 PHP 5 + 编写的 HTML DOM 解析器,可让您以非常简单的方式操作 HTML!
  • 需要 PHP 5+。
  • 支持无效的 HTML。
  • 使用选择器在 HTML 页面上查找标签,就像 jQuery 一样。
  • 从一行中提取 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;


刮刮 Slashdot:

// 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。