Pull to refresh

Comments 35

Спасибо, интересно было почитать. А по поводу производительности — вы сравнивали насколько это быстрее/медленнее чем парсить используя регекспы?
сегодня с утра как раз ручками писал… особо писать нечего кроме регулярки
работает. но кривота гербедж коллектора в php такова что на парсинге сайтов в 20 000 страниц не успевает удалять объекты (которые удаляются implicitly) скрипт отжирает до гига памяти. мораль — учим XPath & DOMXML
Таким способом «XPath & DOMXML» память намного экономнее используется?
ну метров 102-105 на неоптимизированном php-cli. скорость работы тоже на пару порядков выше — 20-30 минут вместо 4 часов на phpquery. да и кода меньше получается.
Спасибо за консультацию, тоже в принципе достаточно много, но как говорится, за удобство приходится платить. Если памяти мало, то мой вывод — лучше использовать регулярные выражения.
это user memory на процесс. memory_get_usage дает от десяти до 30 мегабайт.

ну хз хз. ругйлярки мне не подошли, потому что приходилось парсить выражения типа «h2 который находится в том же div что и третья таблица в документе» — без классов и id. xpath это делает одной строкой — //table[3]/../h2
И еще интересно, как на счет потребления памяти по сравнению с регулрными выражениями?
Я конечно не тестировал, но предполагаю, что ругулярки будут выигрывать на порядок.
Регулярные выражения не подходят для парсинга xml-подобного документа. Дело не в скорости, а в сложности.
Штука очень забавная. Правда не без глюков.
А насчет регулярок — да, быстрее, но с ней гораздо проще, особенно при разборе сложных докментов.
Именно это удобство меня и зацепило в ней.
Насчёт глюков, библиотека ещё молодая, если судить по дате публикации архивов =) Да и документированность плохая, радуют «Enter description here...» в коде =)
А если документ невалидный в плане хмл?
Т.к. phpQuery использует DOMXML & XPath внутри, то и отношение к malformed xml у него аналогичное, поэтому наверное лучше перед загрузкой прогнать через Tidy
Хороший инструмент. спасибо!
Как бы ещё добраться до контента, генерируемого динамически, например тем же Javascript'ом?
тем же javascript'ом и добраться :)
передать на сервер можно через ajax
Не совсем понял что Вы Имеете в виду. Вы предлагаете с помощью phpquery решить этот вопрос или «вручную» разбираться в ява скрипте? А если там какое-либо сложное высчитывамие переменных для запроса или не запрос вовсе, а какой-нибудь document.write, но опять-таки со сложновысчитанными параметрами?
Вижу очень безумную идею, расширение к firefox, которое дампит данные по факту загрузки страницы и отсылает их на сервер. где они уже и сохраняются, при этом можно firefox автоматизировать, пусть сам ходит по страницам и отсылает данные, жаль что это клиент side
нет. Если проблема частного характера, то можно тем же jquery повесить обработчики и генерируемый контент пересылать на сервер.
Если общего и неизвестно какие функции генерируют контент, можно проверять блоки данных на изменение с первоначальной информацией.
вообще к задаче лучше подходить практически — решать конкретно то что нужно делать. потом и обобщить можно…
Можете привести пример задачи общего характера?
притянутый за уши только :)
к примеру есть несколько сайтов с разной структурой, где стоят какие то информеры, которые тянуться уже после загрузки страницы. расположение неизвестно.

имхо, даже частная задача будет встречаться редко и писать для этого отдельную программку смысла нет, видимо по этому и нету такого в phpQuery
А как Вы предлагаете
проверять блоки данных на изменение с первоначальной информацией

если они подгружатеся динамически уже после загрузки страницы?
без понятия. надо рассматривать конкретную задачу :)

***теоретически… допустим у нас есть сайт, которые разбит по блокам с какими то id
при первом парсинге запоминаем эти блоки и их длину (можно на клиенте str.length)
проходимся опять по блокам и сраниваем их длину. если контента стало больше — появилось свеженькое.
Афигенная штука, если надо распарсить сложный древовидный документ. На одной странице работает терпимо, а весь сайт парит медленно. За удобство приходится платить?

Думаю, это библиотека подходит для использования в условиях выделенного сервера с возможностью запуска PHP без ограничения памяти и времени исполнения, а на виртуальном хостинге — обрывается.
Как вариант работа с домашнего сервера с предварительной загрузкой страницы через wget.
+ прикручиваем потоки для php, время должно сократиться, а вот загрузка (как памяти так и процессорных мощностей) может возрасти, вопрос только в каких пределах.
А почему именно wget'ом хотите забирать, а не, например, curl'ом?
а) Функционала больше.
Иногда необходимо сдёрнуть всю страницу + уровни лежащие ниже, или же отзеркалить структуру в уже сущевствующую папку для проверки произошедших изменений.

б) привык =)

Хотя иногда проще парсить страницы на лету perl + regex'ы
При выводе скаченной страницы без парсинга все выклядит нормально, после парсинга бьются русские буквы? как решить эту проблему?
возможно сам фаил скрипта не в той кодировке или кодировка сайта отлична от UTF-8
в том то и дело, что сайт который паршу — утф, скрипт — утф, все утф
Проверяйте настройки DOM расширения для php или попробуйте на другой установке Php
в локале (MacOSX Lion) и на сервере (Debian) результат одинаков
echo iconv("windows-1251", "utf-8", $content);
Да вы не просто капитан, вы подполковник очевидность. Проблема была с разной разрядностью символов.
уберите указание кодировки в коде

$doc = phpQuery::newDocumentHTML($data['document']);

Мне помогло

	public static function newDocumentHTML($markup = null, $charset = null) {
		$contentType = $charset
			? ";charset=$charset"
			: '';
		return self::newDocument($markup, "text/html{$contentType}");
	}
Sign up to leave a comment.

Articles