3

我需要解析 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和本机 PHP DOMDocument API可以解析的内容存在文件大小限制?如果是这种情况,有人知道这个限制是什么吗?我现在已经用谷歌搜索了 40 分钟,但没有成功。

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

4

2 回答 2

10

PHP “Native” DOMDocumentDocs及其小姐妹SimpleXMLElementDocs没有硬编码大小限制,但它们受到您允许 PHP 使用的内存的限制(请参阅PHP memory limit Docs)。

此外,您不能假设加载 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 进行解析将需要很长时间。然后使用XMLReader文档将允许您解析文档而不将其加载到内存中(完全)。但这不是灵丹妙药,因为您仍然拥有解析时间,但您可以更好地控制要解析的内容以及要跳过的部分,因此您有更多空间来控制 PHP 用户空间中的优化。


PHP 库PHP Simple HTML DOM Parser Docs也没有施加特定的大小限制。然而,它不是 PHP 的二进制扩展,而是在 PHP 用户空间中。因此,您需要更好地了解该库的确切作用(参见simple_html_dom.phpHEAD 修订版)。如果您查看代码,您会发现它是一个纯粹用 PHP 编写的解析器。这是因为它最初是为 PHP 4 编写的,而DOMDocumentwithDOMDocument::loadHTML尚不存在。

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

但是:由于多年以来,不再需要使用该库。许多 PHP 用户不知道这一点,他们使用曾经流行的库发现过时的代码示例。库PHP Simple HTML DOM Parser甚至仍然不时在 Stackoverflow 上得到建议。

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

于 2013-04-04T09:09:55.330 回答
3

PHP Simple HTML DOM Parser 有 600KB 的限制。

define('MAX_FILE_SIZE', 600000);

当然,您可以编辑您的库副本并更改此常量。

于 2013-06-01T10:29:37.990 回答