Проблема с использованием PHPQuery - PullRequest
2 голосов
/ 22 февраля 2011

Я пытаюсь использовать 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 ]

8 голосов
/ 18 декабря 2011

У меня был такой же вопрос! Так что отвечая для следующих посетителей на этот вопрос.

Простой HTML Dom имеет некоторые проблемы с утечкой памяти. Вы должны быть очень осторожны, когда вы «клонируете» объект с помощью его селектора. Избегайте этого!

С phpQuery это всего лишь одна команда, которая очищает все, насколько я знаю.

phpQuery::unloadDocuments();

Я тестировал phpQuery. Который, похоже, не имеет утечек памяти. Также очень и очень низкое использование памяти. Только 4 КБ на файл 90 КБ. Таким образом, похоже, что он анализирует в режиме реального времени и не имеет документа в памяти. По крайней мере, это то, что я нашел, я могу ошибаться.

Также попытался создать 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 голос
/ 22 февраля 2011

Ваш код выглядит нормально.Этот в основном эквивалентный код работал для меня отлично.

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

...