Проблема с использованием 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 ответа
У меня такой же вопрос! Так что отвечаю для следующих посетителей на этот вопрос.
Простой 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% быстрее при выборе:(
Ваш код выглядит хорошо. Этот в основном эквивалентный код работал отлично для меня.
$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.