Честно говоря, иногда подумываю написать обёртку для регекспов, какой-нить облегчённый xpath. Просто бывает, когда надо парсить миллионы страниц, xpath слишком медленный, вернее само построение DOM-дерева.
Смотря, что за проект. Практика показывает, что есть неиллюзорные шансы найти кучу костылей и говнокода, написанных несколько лет назад человеком, которого и в проекте то уже нету :)
Ясно. Ну такой подход ожидаемо тормозит по сравнению с lxml. Тормозит чуть ли не в 10 раз: dumpz.org/122917/ Думаю тормоза из-за того, что каждый раз вызывается функция и каждый раз в ней стрится дополнительный PyQuery-объект.
А вообще, раз мы про pyquery заговорили, я подумал — самое время — и замержился с pyquery-форком. В общем, теперь в грабе через аттрибут `pyquery` доступно PyQuery-дерево.
pyquery предоставляет возможность писать селекторы в виде jquery-селекторов, не путайте их с css-селекторами.Это разные вещи, хоть и похожи. Кроме того, я писал выше, что lxml не поддерживает сложные css-селекторы. Мне сейчас проверять лень.
Так, с примером проблема. Я не знаю, как в scrapy без создания целого парсера просто получить HtmlXPathSelector от какого-либо содерижмого, он хочет какой-то response-объект, если вы мне подскажите, как его сделать, я напишу пример.
А почему оно должно было заработать? Yield же должен кто-то ловить и обрабатывать, ну вот его и ловит код, который task-функцию вызывает. Если хотите добавить из другого места task, то можете использовать просто self.add_task(Task(..)). А yield это просто для удобства и красоты.
А там, по-моему, обрезанный какой-то css, я как-то пробовал :nth-child(x) — у меня не заработало. А pyquery, наверное, всё корректно транслирует в xpath.
Бывают сайты с табличной вёрсткой, где множество вложенных тэгов table, tr, td. Там особо не к чему привязаться кроме поясняющего текста внутри нужной ячейки
А вообще, раз мы про pyquery заговорили, я подумал — самое время — и замержился с pyquery-форком. В общем, теперь в грабе через аттрибут `pyquery` доступно PyQuery-дерево.
Показана реальная ситуация, я очень часто итерируюсь по xpath выборке и применяю дополнительные xpath-выражения к каждому элементу выборки.
У меня такие результаты:
lorien@athlon:/web/barn$ python speed3.py
HtmlXpathSelector: 0.75
lxml: 0.02
Equal: True
Весь трафик кстати можно логировать как с обычным Grab.
bot = SomeSpider(...)
bot.setup_grab(log_dir='/path/to/dir')
//div/strong[contains(text(), «Google»)]