我需要解析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?
答案 0 :(得分:10)
PHP“Native”DOMDocument
Docs及其小妹妹SimpleXMLElement
Docs没有硬化的大小限制,但它们受到允许PHP使用的内存的限制(请参阅PHP memory limitDocs)。
此外,您不能假设加载100 MB XML或HTML文件会消耗相同大小的内存。它通常比文件大小更少的内存(例如,五分之一或十分之一或甚至,取决于XML,所以你不能只在这里说因子X而是你需要衡量自己的内容,如果你想获得精确的信息)。
你在问题中提供的文件大小 - 3 MB - 我说的相当小。对于互联网上的HTML文件而言可能不小,但基于libxml的PHP扩展可能很小。使用memory_get_usage()
Docs加载该文件时,可以了解PHP中的内存使用情况。
如果你有非常大的XML文件 - 那么通常是X(HT)ML - 比方说1.5 千兆字节 - 使用DOMDocument进行解析会花费很多时间。然后使用XMLReader
Docs将允许您解析文档而不将其加载到内存中(完全)。但它不是银弹,因为你仍然有解析时间,但你可以更好地控制要解析的内容和要跳过的部分,这样你就有更多的空间来控制PHP用户空间的优化。
PHP库PHP Simple HTML DOM ParserDocs也没有强加特定的大小限制。但它不是PHP的二进制扩展,而是PHP用户空间。因此,您需要更好地了解该库的确切功能(请参阅simple_html_dom.php
in HEAD revision)。如果你查看代码,你会发现它是一个纯粹用PHP编写的解析器。这是因为它是为PHP 4编写的,其中DOMDocument
DOMDocument::loadHTML
尚未存在。
可以想象,PHP扩展可以比用PHP代码编写的PHP库更好地管理内存。特别是当涉及HTML Document对象模型的树结构时(这句话本身并不属实,但是开发这种优化的内存需要大量的工作和良好的设计,并不总是易于创建和维护)。
但是:多年以后不再需要使用该库。许多PHP用户不知道这一点,并且他们使用曾经流行的库找到过时的代码示例。库Stack PHP Simple HTML DOM Parser 甚至还会在Stackoverflow上不时得到建议。
所以我能给出的最佳建议是:除非你不需要编写PHP 4兼容代码,否则根本不要使用该库,也不要关心它的限制。而是将代码移植到DOMDocument::loadHTML()
Docs。
答案 1 :(得分:3)
PHP Simple HTML DOM Parser的限制为600KB。
define('MAX_FILE_SIZE', 600000);
当然,您可以编辑库的副本并更改此常量。