PHP中的HTML/XML解析:为您的任务选择最佳工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
\n

如何在PHP中解析HTML/XML?为您节省数小时的方法对比

\n

您是否曾遇到过从他人网站提取数据或解析复杂XML配置文件的任务?如果是,您一定知道用strpos()和explode()进行“手动”解析会多么迅速地变成噩梦。一个标签出错——整个爬虫就崩溃了。好消息是:PHP提供了几个强大且优雅的解决方案。坏消息是:很容易在选择哪个方案时感到困惑。在本文中,我们将详细梳理PHP中解析HTML和XML的所有主要方法,对比它们的性能和易用性,让您最终明白该将哪个工具收入囊中。

\n\n

为什么不应该自己造轮子?

\n

初学者的第一反应是用正则表达式编写自己的解析器。是的,对于一次性且HTML结构完美的任务,这或许可行。但一旦页面上出现嵌套标签、注释,或者更糟,出现无效的HTML(现实世界中90%的HTML都是如此),正则表达式就无能为力了。与其花时间调试几十个模式,不如使用现成的库。它们已经为您解决了所有问题。

\n\n

方法一:DOMDocument——处理HTML的“重型武器”

\n

DOMDocument是PHP的内置扩展,它构建完整的DOM文档树。它的主要超能力是处理混乱的HTML。您只需将字符串传递给它,它就会尝试修复它。非常适合解析真实的网页。

\n

以下是一个经典示例:从HTML中提取所有链接。

\n
<?php\n$html = '<a href="https://pythonlib.ru">PythonLib</a>\n        <a href="https://php.net">PHP.net</a>';\n\n$dom = new DOMDocument();\n// 抑制解析无效HTML时的错误\nlibxml_use_internal_errors(true);\n$dom->loadHTML($html);\nlibxml_clear_errors();\n\n$xpath = new DOMXPath($dom);\n$links = $xpath->query('//a/@href');\n\nforeach ($links as $link) {\n    echo $link->nodeValue . "\\n";\n}\n?>
\n

优点:

\n
    \n
  • 能处理任何HTML,即使是损坏的。
  • \n
  • 完全支持XPath——可以进行复杂查询。
  • \n
  • 内置于PHP,无需安装。
  • \n
\n

缺点:

\n
    \n
  • 处理大型文档时消耗大量内存。
  • \n
  • 在简单任务上比替代方案慢。
  • \n
  • 对于简单的数据提取,API不够方便。
  • \n
\n\n

方法二:SimpleXML——处理XML的轻量与优雅

\n

如果您处理的是已知有效的XML(RSS源、API响应、配置文件),SimpleXML是您最好的朋友。它将XML转换为对象,您可以像访问属性一样访问元素,像访问数组元素一样访问属性。

\n

解析RSS源的示例:

\n
<?php\n$xml = '<rss>\n    <channel>\n        <item>\n            <title>新闻1</title>\n            <link>https://example.com/1</link>\n        </item>\n        <item>\n            <title>新闻2</title>\n            <link>https://example.com/2</link>\n        </item>\n    </channel>\n</rss>';\n\n$feed = simplexml_load_string($xml);\n\nforeach ($feed->channel->item as $item) {\n    echo $item->title . ': ' . $item->link . "\\n";\n}\n?>
\n

优点:

\n
    \n
  • 语法极其简单直观。
  • \n
  • 内存消耗最小。
  • \n
  • 非常适合读取配置文件。
  • \n
\n

缺点:

\n
    \n
  • 无法处理无效的HTML。
  • \n
  • 添加/修改节点比较困难。
  • \n
  • 不支持XPath(尽管有SimpleXMLE)。
  • \n

博客

书籍推荐