我尝试使用PHPquery来抓取网页(free-lance.ru)
Simple HTML Dom中的等效代码正在运行:
include('simple_html_dom.php');
$shd = str_get_html($html);
$projects = array();
$i = 0;
foreach ($shd->find('.project-preview') as $work){
$projects[$i]['name'] = $work->find('h3', 0)->children(1)->plaintext;
$i++;
}
但我需要在PHPQuery中使用它。
我尝试使用类似的东西:
include('phpQuery.php');
$pq = phpQuery::newDocument($html);
foreach ($pq->find('.project-preview') as $work){
echo 'wow';
}
但它不起作用... sizeof($ pq-> find('。project-preview'))是0
我将非常感谢任何帮助。
答案 0 :(得分:8)
我有同样的问题!所以回答这个问题的下一个访问者。
简单的HTML Dom存在一些内存泄漏问题。当你通过选择器“克隆”对象时,你必须非常小心。避免它!
据我所知,使用phpQuery只有一个命令可以清除所有内容。
phpQuery::unloadDocuments();
我测试了phpQuery。看起来它没有内存泄漏。内存使用率也非常低。在90 kB的文件上只有4 kB。所以看起来它实时解析并且没有内存中的文档。至少那是我发现的,我可能是错的。
还尝试创建20-30个文档并且每次都使用卸载,没有内存增加......很好!
这是我的回答:
include('phpQuery.php');
$pq = phpQuery::newDocument($html);
$projects = array();
$i = 0;
foreach ($pq['.project-preview'] as $work) {
// iteration returns PLAIN dom nodes, NOT phpQuery objects
$pqwork = pq($work);
$projects[$i]['name'] = $pqwork['div']->eq(1)->text();
// Unfortunately pq($work)['div']->eq(1)->text(); does not work
$i++;
}
phpQuery::unloadDocuments();
如果我们有更多基本事物的例子,那就太好了!好的项目,糟糕的文档。或者至少我找不到解释text()函数的文档。
基准估计:
phpQuery在加载文档方面快〜3.5。
简单的HTML Dom在选择时看起来快〜30%:(
答案 1 :(得分:1)
您的代码看起来很好。这个基本上等效的代码对我来说运行得很好。
$q = phpQuery::newDocument('
<html>
<body>
<div class="findme">Lorem ipsum</div><div class="ignoreme">dolor sit amet</div>
</body>
</html>
'
);
foreach($q->find('.findme') as $tag) {
echo 'Found: '.$tag->tagName."(".$tag->getAttribute('class').")\n";
}
结果:
发现:div(findme)
所以,问题变成了:
<强>更新强>
从下面的评论中可以看出,您正在尝试使用newDocment()
打开html文件。那是行不通的。你必须使用newDocumentFile()
- 或者自己阅读文件内容,然后使用newDocument()
,将你读到的内容传递给phpQuery。