如何在 PHP 中解析和处理 HTML/XML?
P粉838563523
P粉838563523 2023-08-23 20:18:41
0
2
489
<p>如何解析 HTML/XML 并从中提取信息?</p>
P粉838563523
P粉838563523

全部回复(2)
P粉402806175

尝试简单 HTML DOM 解析器

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

注意:顾名思义,它对于简单的任务很有用。它使用正则表达式而不是 HTML 解析器,因此对于更复杂的任务来说速度会慢得多。其大部分代码库是在 2008 年编写的,此后仅进行了少量改进。它不遵循现代 PHP 编码标准,并且很难合并到现代 PSR 兼容项目中。

示例:

如何获取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);
P粉436410586

原生 XML 扩展

我更喜欢使用原生 XML 扩展之一,因为它们与PHP 通常比所有第 3 方库更快,并为我提供了对标记所需的所有控制。

DOM

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

使用 DOM 需要一些时间才能提高工作效率,但在我看来,这段时间是值得的。由于 DOM 是一个与语言无关的接口,您会发现多种语言的实现,因此如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的 DOM API。

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

基本用法示例一般概念概述可在其他答案中找到。

XMLReader

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

另一个答案中提供了基本用法示例

XML 解析器

XML 解析器库也基于 libxml,并实现了 SAX 风格的 XML 推送解析器。对于内存管理来说,它可能是比 DOM 或 SimpleXML 更好的选择,但比 XMLReader 实现的拉解析器更难使用。

SimpleXml

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

提供了基本使用示例,并且有PHP 手册中有很多其他示例


第 3 方库(基于 libxml)

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

FluentDom

HtmlPageDom

phpQuery

这被描述为“废弃软件和错误:使用时需要您自担风险”,但似乎维护程度最低。

laminas-dom

fDOMDocument

sabre/xml

FluidXML


第 3 方(不基于 libxml)

基于 DOM/libxml 构建的好处是,您可以立即获得良好的性能,因为您基于本机扩展。然而,并非所有第三方库都走这条路。下面列出了其中一些

PHP 简单 HTML DOM 解析器

我一般不推荐这个解析器。代码库很糟糕,解析器本身相当慢并且占用内存。并非所有 jQuery 选择器(例如 子选择器)都是可行的。任何基于 libxml 的库都应该轻松超越这一点。

PHP Html 解析器

再说一遍,我不会推荐这个解析器。 CPU 使用率高时速度相当慢。也没有清除创建的 DOM 对象内存的功能。这些问题在嵌套循环中尤其严重。该文档本身不准确且拼写错误,自 2016 年 4 月 14 日以来没有任何修复响应。


HTML 5

您可以使用上述内容来解析 HTML5,但由于 HTML5 允许的标记,可能会出现一些奇怪的情况。因此,对于 HTML5,您可能需要考虑使用专用解析器。请注意,这些是用 PHP 编写的,因此与使用较低级别语言编译的扩展相比,性能较慢且内存使用量增加。

HTML5DomDocument

HTML5


正则表达式

最后也是最不推荐,您可以使用正则表达式从 HTML 中提取数据一个>。一般来说,不鼓励在 HTML 上使用正则表达式。

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

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

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

另请参阅克苏鲁方式解析 Html


书籍

如果你想花点钱,可以看看

我不隶属于 PHP 架构师或作者。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板