【问题标题】:Problem with using PHPQuery使用 PHPQuery 的问题
【发布时间】:2011-02-22 09:03:44
【问题描述】:

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

我将非常感谢任何帮助。

【问题讨论】:

  • 两个问题:如果你有它在 simple_dom 中工作,你为什么需要 PHPQuery?到目前为止,您在 PHPQuery 中尝试过什么?
  • 我需要测试PHPQuery的有效性
  • 如果你确定它是一个 .html 文件,为什么不使用newDocumentHTML 而不是newDocument 呢?

标签: php parsing simple-html-dom phpquery


【解决方案1】:

我也有同样的问题!因此,为下一个访问者回答这个问题。

简单的 HTML Dom 存在一些内存泄漏问题。当您通过其选择器“克隆”对象时,您必须非常小心。避免它!

据我所知,使用 phpQuery 只有一个命令可以清除所有内容。

phpQuery::unloadDocuments();

我测试了 phpQuery。看起来它没有内存泄漏。内存使用量也非常低。 90 kB 的文件只有 4 kB。所以看起来它是实时解析的,并且内存中没有文档。至少这是我发现的,我可能是错的。

还尝试创建 20-30 个文档并每次都使用 unload,没有增加内存...很好!

这是我的答案:

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% :(

【讨论】:

  • 非常感谢您对 unloadDocuments() 的提示,我的脚本使用了这么多 RAM,因为简单地取消设置并没有释放内存,但是在调用 $mydom->unloadDocument() 之后所有内存被正确清理。他们应该向 phpQuery 添加一个析构函数,以便它自动执行此操作...
  • 很高兴听到! :) 是的,内存管理确实可以更好。
【解决方案2】:

您的代码看起来不错。这个基本上等效的代码对我来说运行得很好。

$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。

【讨论】:

  • 嗯,它不适用于离线 txt 文件...我将 free-lance.txt 与网站内容一起使用...但是...可能原因是编码?文件在 utf-8 中,但站点在 cp1251 中?
  • 如果它是一个 HTML 文档,不要将文件命名为 .txt - 这只是令人困惑。此外,要从文件中读取(而不是字符串),请使用 phpQuery::newDocumentFile(),而不是 newDocument()。 code.google.com/p/phpquery/wiki/Basics 上提到了这一点。
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2010-12-11
  • 2011-06-03
相关资源
最近更新 更多