title: Python et HTML
slug: python-html
date: 2016-05-04
chapo: Python n’est le premier langage de personne mais le second langage de tout le monde.

> Python n’est le premier langage de personne…  
> …mais le second langage de tout le monde.

*Je ne sais plus où j’ai lu/entendu cette citation mais je la trouve pertinente :-).*

En discutant avec [Karl](http://la-grange.net/karl/) sur [IRC](irc://chat.freenode.net/##openweb), je me rends compte qu’il y a tout un tas d’outils en Python permettant d’interagir avec HTML. Le plus évident et assez bas niveau est [requests](http://docs.python-requests.org/) qui permet de [récupérer des pages](https://github.com/compjour/search-script-scrape) (que vous pouvez [cacher](https://github.com/reclosedev/requests-cache) et [tester](https://github.com/getsentry/responses)) depuis votre code Python avec une API simple. Si vous avez besoin de faire cela depuis la ligne de commande [HTTPie](http://httpie.org) (qui est une surcouche de `requests`) remplace `curl` ou `wget` avec brio. Si vous avez besoin de comparer des codes HTTP, il y a [status](https://github.com/avinassh/status) mais on tombe dans les dangers de la micro-dépendance.

Pour aller plus loin il y a [PyQuery](http://pyquery.readthedocs.io/) qui utilise `lxml` ou [tq](https://github.com/plainas/tq) qui utilise `BeautifulSoup`. Ce dernier retourne aisément du JSON (comme [JamAPI](http://www.jamapi.xyz/)) que vous pourrez analyser avec [jq](https://stedolan.github.io/jq/) sans quitter votre shell (utile également pour [documenter une API](https://www.data.gouv.fr/fr/apidoc/)).

Enfin il y a [Scrapy](http://scrapy.org/) si vous avez besoin de récupérer plus de quelques URL manuellement. Je me demande dans quelle mesure [l’emploi d’asyncio/aiohttp](http://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html) ([cache](/david/cache/44abc2fd416f673b9c6ae0f5147726a9/)) permettrait d’aller [encore plus vite](https://github.com/orf/cyborg) mais [d’après mon expérience](/david/blog/2015/croquer-liens/) le facteur limitant est souvent le temps de réponse du serveur en face…

Pour le contenu d’articles, j’utilise ici [readability-lxml](https://pypi.python.org/pypi/readability-lxml) pour mettre les liens en cache mais j’envisage de passer à [newspaper](http://newspaper.readthedocs.io/), il faudrait que je teste ce que ça donne sur la soupe de tags de Medium (au passage si vous utilisez ce service en espérant un jour pouvoir récupérer vos contenus en HTML réutilisable, essayez aujourd’hui). Pour aller plus loin dans le domaine, il y aurait [PyWb](https://github.com/ikreymer/pywb) ou [newsdiffs](https://github.com/ecprice/newsdiffs) qui prennent en compte les versions. Explorer aussi [robobrowser](https://github.com/jmcarp/robobrowser).

J’en oublie sûrement car il est difficile de chercher dans ses étoiles Github. N’hésitez pas à m’envoyer les vôtres.

Karl me propose également [html5lib](http://html5lib.readthedocs.io/).