使用PHPQuery的问题

时间:2011-02-22 09:03:44

标签: php parsing simple-html-dom phpquery

我尝试使用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

我将非常感谢任何帮助。

2 个答案:

答案 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)

所以,问题变成了:

  • 您收到任何错误吗? (并且启用了error_reporting?display_errors怎么办?)
  • 您的HTML是什么样的?

<强>更新

从下面的评论中可以看出,您正在尝试使用newDocment()打开html文件。那是行不通的。你必须使用newDocumentFile() - 或者自己阅读文件内容,然后使用newDocument(),将你读到的内容传递给phpQuery。