如何解析 HTML/XML 并从中提取信息?
原文由 RobertPitt 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何解析 HTML/XML 并从中提取信息?
原文由 RobertPitt 发布,翻译遵循 CC BY-SA 4.0 许可协议
试试 简单的 HTML DOM 解析器。
注意:顾名思义,它对简单的任务很有用。它使用正则表达式而不是 HTML 解析器,因此对于更复杂的任务来说会慢得多。它的大部分代码库是在 2008 年编写的,此后只做了很小的改进。它不遵循现代 PHP 编码标准,并且很难融入现代 PSR 兼容项目。
// 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>';
// 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;
// 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);
原文由 Naveed 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答1.6k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
4 回答1.6k 阅读
2 回答981 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答984 阅读✓ 已解决
本机 XML 扩展
我更喜欢使用一种 原生 XML 扩展,因为它们与 PHP 捆绑在一起,通常比所有第 3 方库都快,并且给我对标记所需的所有控制权。
DOM
DOM 能够解析和修改真实世界(损坏的)HTML,并且它可以进行 XPath 查询。它基于 libxml 。
使用 DOM 需要一些时间来提高效率,但在我看来,这段时间是值得的。由于 DOM 是与语言无关的接口,您会发现许多语言的实现,因此如果您需要更改编程语言,那么您很可能已经知道如何使用该语言的 DOM API。
StackOverflow 上已经 广泛 介绍了如何使用 DOM 扩展,因此如果您选择使用它,可以确定您遇到的大部分问题都可以通过搜索/浏览 Stack Overflow 来解决。
其他答案中提供了 基本用法示例 和 一般概念概述。
XML阅读器
与 DOM 一样,XMLReader 也是基于 libxml 的。我不知道如何触发 HTML 解析器模块,所以使用 XMLReader 解析损坏的 HTML 可能不如使用 DOM 可靠,在 DOM 中您可以明确告诉它使用 libxml 的 HTML 解析器模块。
另一个答案中提供了一个 基本用法示例。
XML 解析器
XML 解析器库也基于 libxml,并实现了 SAX 风格的 XML 推送解析器。对于内存管理来说,它可能是比 DOM 或 SimpleXML 更好的选择,但比 XMLReader 实现的拉式解析器更难使用。
简单的XML
当您知道 HTML 是有效的 XHTML 时,SimpleXML 是一个选项。如果您需要解析损坏的 HTML,甚至不要考虑 SimpleXml,因为它会令人窒息。
提供了一个 基本用法示例 ,PHP 手册中还有许多其他示例。
第 3 方库(基于 libxml)
如果您更喜欢使用第 3 方库,我建议使用实际上在底层使用 DOM / libxml 而不是字符串解析的库。
FluentDom
HtmlPageDom
查询
这被描述为“废弃软件和错误:使用风险自负”,但似乎维护最少。
层域
fDOM文档
军刀/ xml
流体XML
第 3 方(不是基于 libxml 的)
在 DOM/libxml 上构建的好处是您可以获得开箱即用的良好性能,因为您是基于本机扩展的。然而,并不是所有的 3rd 方库都走这条路。下面列出了其中一些
PHP 简单的 HTML DOM 解析器
我一般不推荐这个解析器。代码库很糟糕,解析器本身相当慢并且需要内存。并非所有 jQuery 选择器(例如 子选择器)都是可能的。任何基于 libxml 的库都应该很容易胜过这一点。
PHP HTML 解析器
同样,我不会推荐这个解析器。 CPU 使用率高时速度相当慢。也没有清除创建的 DOM 对象内存的功能。这些问题尤其适用于嵌套循环。文档本身不准确且拼写错误,自 2016 年 4 月 14 日以来没有对修复做出回应。
HTML 5
您可以使用上面的代码来解析 HTML5,但由于 HTML5 允许的标记 ,可能会有一些怪癖。所以对于 HTML5 你可能要考虑使用专用的解析器。请注意,这些是用 PHP 编写的,因此与使用低级语言的编译扩展相比,性能较慢且内存使用量增加。
HTML5Dom文档
HTML5
常用表达
最后也是 最不推荐 的,您可以使用 正则表达式 从 HTML 中提取数据。通常不鼓励在 HTML 上使用正则表达式。
您在网络上找到的大多数匹配标记的片段都很脆弱。在大多数情况下,它们只适用于一段非常特殊的 HTML。微小的标记更改,例如在某处添加空格,或者添加或更改标记中的属性,可能会导致 RegEx 在编写不正确时失败。在 HTML 上使用 RegEx 之前,您应该知道自己在做什么。
HTML 解析器已经知道 HTML 的句法规则。必须为您编写的每个新 RegEx 教授正则表达式。 RegEx 在某些情况下很好,但这实际上取决于您的用例。
您 可以编写更可靠的解析器,但是当上述库已经存在并且在这方面做得更好时,使用正则表达式编写 完整可靠 的自定义解析器是浪费时间。
另见 解析 Html 克苏鲁之道
图书
如果你想花点钱,看看
我不隶属于 PHP 架构师或作者。