PHP Native DOMDocument 和 Simple DOM Parser - 有大小限制吗?

标签 php domdocument

我需要解析 HTML 文档(由 Microsoft Word 生成)的内容。遍历 DOM 以获取我需要的信息/内容,然后将所需内容输出为 CSV。我知道几乎没有脑外科手术。

现在,由于 PHP 不是我真正喜欢的东西,而且我的日程安排很紧,我打算使用来自 http://simplehtmldom.sourceforge.net/PHP Simple HTML DOM Parser

我注意到我的脚本不工作。经过反复试验,我意识到这是由 Word 生成的 HTML 文件的文件大小造成的(它们为 3MB,并且有多达 30,000 行 HTML!)。我假设对于可以使用 PHP Simple HTML DOM Parser 和 native PHP DOMDocument API 可以解析的文件有大小限制?如果是这种情况,有人知道这个限制是多少吗?我已经用谷歌搜索了 40 分钟,但没有成功。

也许我应该只使用 Node.js?

最佳答案

PHP“原生”DOMDocumentDocs和它的妹妹SimpleXMLElementDocs没有硬编码的大小限制,但它们受限于您允许 PHP 使用的内存(参见 PHP memory limitDocs )。

此外,您不能假定加载 100 MB 的 XML 或 HTML 文件会消耗相同大小的内存。它通常比文件大小的内存少得多(例如,五分之一或十分之一甚至,有点取决于 XML,所以你不能在这里只说因子 X,如果你想获得精确的,你需要自己衡量信息)。

你在问题​​中给出的文件大小 - 3 MB - 我会说相当小。对于 Internet 中的 HTML 文件来说可能不小,但对于 libxml 来说可能很小基于 PHP 扩展。使用 memory_get_usage()Docs 加载该文件时,您可以了解 PHP 中的内存使用情况。 .

如果您有非常大的 XML 文件 - 那么通常是 X(HT)ML - 比如说 1.5 GB - 使用 DOMDocument 进行解析将花费很多准备时间。然后使用 XMLReaderDocs将允许您在不将文档加载到内存(完全)的情况下解析文档。但这不是 Elixir ,因为您仍然有解析时间,但您可以更好地控制要解析的内容以及要跳过的部分,这样您就有更多空间来控制 PHP 用户空间中的优化。


PHP 库 PHP Simple HTML DOM ParserDocs也没有施加特定的大小限制。然而,它不是 PHP 的二进制扩展,而是在 PHP 用户领域。因此,您需要更好地了解该库的确切功能(请参阅 simple_html_dom.php in HEAD revision)。如果您查看代码,您会发现它是一个纯粹用 PHP 编写的解析器。这是因为它最初是为 PHP 4 编写的,其中 DOMDocumentDOMDocument::loadHTML 尚不存在。

您可以想象,PHP 扩展可以比用 PHP 代码编写的 PHP 库更好地管理内存。特别是当涉及到 HTML 文档对象模型的树结构时(这句话本身并不正确,但是开发这种内存优化需要大量工作和一个并不总是容易创建或维护的好设计)。

但是:很多年过去了,没有必要再使用那个库了。许多 PHP 用户并不知道这一点,他们发现使用这个曾经流行的库的代码示例已经过时。库 PHP Simple HTML DOM Parser 甚至仍然不时在 Stackoverflow 上被推荐。

所以我能给出的最好建议是:除非您不需要编写与 PHP 4 兼容的代码,否则根本不要使用该库并且不要关心它的限制。而是将您的代码移植到 DOMDocument::loadHTML()Docs .

关于PHP Native DOMDocument 和 Simple DOM Parser - 有大小限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15805805/

相关文章:

PHP nodeValue 剥离 html 标签 - innerHTML 替代方案?

php - 为什么 PHP 没有 block 级作用域?

php - php_self 或 phpfilename.php 哪个好

xml - 使用 DOMDocument 的简单 xml 文档中的 & 符号

php - CakePHP Xml 实用程序库触发 DOMDocument 警告

php - 防止 DOMDocument::loadHTML() 转换实体

php - 对 XML 使用 DOMDocument Validate() 会导致无限负载

php - 从具有多类型元素 PHP 的数组插入 MySQL

PhpStorm 代码重构 elseif PHP

PHP 正则表达式 : Matching "Space" if only within delimiter