PyQuery
Manipuler du html et du xml à la jQuery en Python
Olivier Lauzanne - PyCONFr 2009
jQuery
- Une des bibliothèques javascript les plus populaires
- Une bibliothèque légère
- Sélectionner des éléments de la page et effectuer une suite d'actions sur tous ces éléments
- Les sélecteurs sont très similaires aux sélecteur CSS
Sélecteurs CSS
Pourquoi ?
Parce que xpath et xslt sont trop compliqués et verbeux.
CSS est simple et connu de tous les développeurs web.
Par exemple:
a.title {
color: red;
}
Sélecteurs CSS
- a.title : les balise a qui ont la classe 'title'
- a#title : la balise a qui a l'id 'title'
- a, p : les balises a et les balises p
- p a : les balises a dans une balise p
Encore un peu de jQuery
On peut faire la même chose en jQuery:
$('a.title').css('color', 'red')
Ou on peut ajouter quelque chose après tous les titres:
$('a.title').after("don't forget PyCONFr")
Pourquoi PyQuery ?
- Parce que l'API de jQuery me manquait en python
- Parce que je n'étais pas satisfait des API existantes en python
- Parce qu'il est plus facile de réutiliser une API existante que d'en recréer une
Utiliser PyQuery
Si vous connaissez jQuery c'est très simple:
>>> from pyquery import PyQuery as pq
>>> d = pq(url='http://reddit.com/r/python')
>>> d('a.title').css('color', 'red').after("don't forget PyCONFr")
>>> str(d)
--> la chaine qui contient tout le html de la page
Récupérer les titres de reddit
On peut facilement le faire avec un petit script:
from pyquery import PyQuery as pq
d = pq('http://reddit.com/r/python')
for title in d('a.title'):
print pq(title).text() + '\n'
Les liens qui parlent de Python
from pyquery import PyQuery as pq
d = pq('http://reddit.com/r/programming')
for title in d('a.title'):
a = pq(title)
if 'python' in a.text().lower():
print a.text()
print a.attr('href') + '\n'
Utilisations possibles
- Web scrapping
- Manipuler du xml pure et potentiellement l'injecter dans du html
- Web testing
- Templating
- Deliverance
Le coeur de PyQuery
PyQuery est basé sur lxml
lxml est basé sur libxml, une bibliothèque C pour manipuler du xml
lxml fourni déjà des sélecteur CSS
mais les sélecteurs de jQuery ont quelques fonctionnalités supplémentaires:
$('a.title:first')
Développement
- Un projet perso que j'ai publié il y a 6 mois
- 5 contributeurs
- Disponible sur pypi: http://pypi.python.org/pypi/pyquery
- Sur bitbucket : http://bitbucket.org/olauzanne/pyquery/
- Documentation : http://pyquery.org
- Mailing list (très peu active): pyquery@googlegroups.com
Merci. Vous avez des questions ?
- Disponible sur pypi: http://pypi.python.org/pypi/pyquery
- Sur bitbucket : http://bitbucket.org/olauzanne/pyquery/
- Documentation : http://pyquery.org
- Mailing list (très peu active): pyquery@googlegroups.com