Posts tagged with “PYQUERY

07. 08. 2011

pyquery

Co používáte na takovýto domácí scrapovaní (nebo screapování)? Jasně, každej zná lxml nebo BeautifulSoup. BeautifulSoup je vůbec super, pokud potřebujete třeba ještě opravit zacukanej dokument, vyhodit nějaký nepřístojný tagy, převézt entity apod. Pak je tady další klasika — Mechanize — ten je ale už spíš na emulaci browseru a hraní si s formulářema. Na stejnou notu je strašně funky Twill. Na něco se daji použít i XPath selektory ve Scrapy, ale to už je zase tahání kanónu na vrabce.

Jestli se nepletu, tak už jsem asi všechno podstatný vystřílel. Tedy až na mojeho miláčka posledních měsíců — pyquery. Nerad bych přepisoval (dobrou) dokumentaci, takže se omezim jen na pár špíčků, který mě fakt rajcujou.

CSS(3) selektory

Kromě šikovnejch :first, :last *, *:checked nebo :selected a dalších můžete používat CSS3 selektory, jak jste zvyklý z JQuery:

>>> from pyquery import PyQuery as pq
>>> doc = pq(url='http://tailf.starenka.net')
>>> doc.find('input[type=password]')
[<input#password>]
>>> doc('div[id^=nav]')
[<div#navigation>]
>>> doc.find('div[id*=a]')
[<div#container>, <div#header>, <div#navigation>]
>>> doc('ul').not_('.dummy')
[<ul#login-shortcuts>]
>>> doc('ul[class!=dummy]')
[<ul#login-shortcuts>]
>>> doc('div > span:last')[0].text_content()
'\n        \n    '
>>> doc.find('div + div')
[<div#navigation>, <div>, <div#content>, <div.entry-content>, <div#footer>]
>>> doc.find('link:first').attr('href')
'/static/starenka/css/starenka.css'

Funkcionální pičovinky

>>> doc('link').eq(2).map(lambda i, el: pq(el).attr('href'))
['/feeds/rss/blog/']
>>> doc('link').map(lambda i, el: 'http://tailf.starenka.net%s'%pq(el).attr('href'))
['http://tailf.starenka.net/static/starenka/css/starenka.css', 
'http://tailf.starenka.net/static/starenka/css/jquery.lightbox-0.5.css', 
'http://tailf.starenka.net/static/starenka/img/favicon.ico',
'http://tailf.starenka.net/feeds/rss/blog/',
'http://tailf.starenka.net/feeds/rss/comments/',
'http://tailf.starenka.nethttp://tailf.starenka.net/openidserver/',
'http://tailf.starenka.nethttp://tailf.starenka.net/openidserver/']
>>> doc('link').filter(lambda el: 'http://tailf.starenka.net' in pq(this).attr('href'))
[<link>, <link>]

Jasně, tohle všechno JE v JQuery a knihovna se jmenuje pyquery, takže by jeden čekal, že to v ní bude taky, ale to nic neubírá na faktu, že je to fakt bájo.

no comments yet