phpjquery
https://github.com/TobiaszCudnik/phpquery
simplehtmldom
http://simplehtmldom.sourceforge.net/
<?php function gddebug() { $arrays = func_get_args (); echo "n<pre>"; foreach ( $arrays as $value ) { echo "==============================================rn"; if (is_array ( $value ) || is_object ( $value )) { ksort ( $value ); echo htmlspecialchars ( print_r ( $value, true ) ) . "rn"; } elseif (is_string ( $value )) { echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn"; } else { var_dump ( $value ); } } echo "</pre>"; } gddebug ( 'init', memory_get_usage () ); require ('phpQuery/phpQuery.php'); gddebug ( 'load libs', memory_get_usage () ); // INITIALIZE IT // phpQuery::newDocumentHTML($markup); // phpQuery::newDocumentXML(); // phpQuery::newDocumentFileXHTML('test.html'); // phpQuery::newDocumentFilePHP('test.php'); // phpQuery::newDocument('test.xml', 'application/rss+xml'); // this one defaults to text/html in utf8 // 文件 内容 // //https://www.google.com.sg/search?hl=zh-CN&site=imghp&tbm=isch&source=hp&biw=1366&bih=653&q=271072+CC240+armani&oq=271072+CC240+armani&gs_l=img.12...5739.5739.0.6570.1.1.0.0.0.0.120.120.0j1.1.0....0...1ac..64.img..1.0.0.Md5Dux9zIdI $doc = phpQuery::newDocumentFileHTML ( 'test.html' ); gddebug ( 'load file', memory_get_usage () ); $obj = $doc->find ( '.rg_di' ); gddebug ( 'load elements', memory_get_usage (), 'count', count ( $obj ) );
输出
============================================== string(4) "init" ============================================== int(62208) ============================================== string(9) "load libs" ============================================== int(1441040) ============================================== string(9) "load file" ============================================== int(1445448) ============================================== string(13) "load elements" ============================================== int(1469744) ============================================== string(5) "count" ============================================== int(100)
===========================simple html dom
<?php function gddebug() { $arrays = func_get_args (); echo "n<pre>"; foreach ( $arrays as $value ) { echo "==============================================rn"; if (is_array ( $value ) || is_object ( $value )) { ksort ( $value ); echo htmlspecialchars ( print_r ( $value, true ) ) . "rn"; } elseif (is_string ( $value )) { echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn"; } else { var_dump ( $value ); } } echo "</pre>"; } gddebug ( 'init', memory_get_usage () ); include 'simple_html_dom.php'; gddebug ( 'load libs', memory_get_usage () ); // INITIALIZE IT // phpQuery::newDocumentHTML($markup); // phpQuery::newDocumentXML(); // phpQuery::newDocumentFileXHTML('test.html'); // phpQuery::newDocumentFilePHP('test.php'); // phpQuery::newDocument('test.xml', 'application/rss+xml'); // this one defaults to text/html in utf8 // //https://www.google.com.sg/search?hl=zh-CN&site=imghp&tbm=isch&source=hp&biw=1366&bih=653&q=271072+CC240+armani&oq=271072+CC240+armani&gs_l=img.12...5739.5739.0.6570.1.1.0.0.0.0.120.120.0j1.1.0....0...1ac..64.img..1.0.0.Md5Dux9 $doc = file_get_html ( 'test.html' ); gddebug ( 'load file', memory_get_usage () ); $obj = $doc->find ( '.rg_di' ); gddebug ( 'load elements', memory_get_usage (), 'count', count ( $obj ) );
============================================== string(4) "init" ============================================== int(62072) ============================================== string(9) "load libs" ============================================== int(527136) ============================================== string(9) "load file" ============================================== int(5590512) ============================================== string(13) "load elements" ============================================== int(5596016) ============================================== string(5) "count" ============================================== int(100)
不用多言,内存使用上完败。。
还只是一个小页面,大页面,基本上simplehtmldom经常性抛出内存不足,需要很很好的进行clear()和unset 来释放内存。同时在解析目标元素时,需要通过正则将目标元素前后元素删除才不会占用过多内存。使用上,phpjquery更接近jquery,个人比较喜欢这类。
本来最近频繁帮朋友采集各种在线商店的商品数据,嫌simple太繁琐,准备自己写个脚本,分离出需要保留的元素来的(包含子节点)。后续研究下phpjquery有没有类似的,没有就自己写一个出来,先占位~