2

PHPquery を使用して Web ページ (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 です

どんな助けにもとても感謝します。

4

2 に答える 2

8

同じ質問がありました!したがって、この質問への次の訪問者に答えます。

シンプルな HTML Dom には、メモリ リークの問題がいくつかあります。セレクターでオブジェクトを「複製」するときは、非常に注意する必要があります。それを避けてください!

私の知る限り、phpQueryを使用すると、すべてをクリアするコマンドは1つだけです。

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% 高速に見えます :(

于 2011-12-18T00:49:51.970 に答える
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 はどのように見えますか?

アップデート:

以下のコメントから、.html ファイルを開こうとしていることがわかりますnewDocment()。それはうまくいきません。newDocumentFile()- またはファイルの内容を自分で読み取ってから、 を使用して、読み取った内容newDocument()を phpQuery に渡す必要があります。

于 2011-02-22T09:56:22.933 に答える