Page 1 sur 1
[requests] installer le module python requests (résolu)
Publié : ven. 05 août 2011, 12:16
par djipey
Bonjour.
Je voudrais installer le module (c'est du python) requests, une simplifiaction de urllib. Voici la présentation:
http://pypi.python.org/pypi/requests
Et voilà la commande que je lance et son retour:
Code : Tout sélectionner
djipey@djipey-desktop:12:09:31:~/Desktop/python/allocine$ sudo pip -v install requests
Downloading/unpacking requests
Could not fetch URL http://pypi.python.org/simple/requests: HTTP Error 301: Moved Permanently - Redirection to url '/simple/requests/' is not allowed
Will skip URL http://pypi.python.org/simple/requests when looking for download links for requests
Real name of requirement requests is requests
Using version 0.5.1 (newest of versions: 0.5.1, 0.5.0, 0.4.1, 0.4.0, 0.3.4, 0.3.3, 0.3.2, 0.3.1, 0.3.0, 0.2.4, 0.2.3, 0.2.2, 0.2.1, 0.2.0)
Downloading requests-0.5.1.tar.gz
Running setup.py egg_info for package requests
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "/home/djipey/Desktop/python/allocine/build/requests/setup.py", line 6, in <module>
import requests
File "requests/__init__.py", line 3, in <module>
from core import *
ImportError: No module named core
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "/home/djipey/Desktop/python/allocine/build/requests/setup.py", line 6, in <module>
import requests
File "requests/__init__.py", line 3, in <module>
from core import *
ImportError: No module named core
----------------------------------------
Command python setup.py egg_info failed with error code 1
Exception information:
Traceback (most recent call last):
File "/usr/lib/python3.2/site-packages/pip/basecommand.py", line 126, in main
self.run(options, args)
File "/usr/lib/python3.2/site-packages/pip/commands/install.py", line 223, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File "/usr/lib/python3.2/site-packages/pip/req.py", line 986, in prepare_files
req_to_install.run_egg_info()
File "/usr/lib/python3.2/site-packages/pip/req.py", line 222, in run_egg_info
command_desc='python setup.py egg_info')
File "/usr/lib/python3.2/site-packages/pip/__init__.py", line 255, in call_subprocess
% (command_desc, proc.returncode))
pip.exceptions.InstallationError: Command python setup.py egg_info failed with error code 1
Storing complete log in /root/.pip/pip.log
De ce que je peux voir il y a une erreur d'importation, mais je ne sais pas du tout quoi faire. Pourriez vous m'aider s'il vous plait?
Re: [requests] installer le module python requests (en cours
Publié : ven. 05 août 2011, 12:35
par Desintegr
Essaye plutôt avec pip2. Le module ne doit pas être compatible avec Python 3.
Re: [requests] installer le module python requests (en cours
Publié : ven. 05 août 2011, 13:00
par djipey
Ok, ça marche avec pip2. Mais du coup, si je code avec python 3, je suis cuit c'est ça?
EDIT: Le module n'est effectivement pas compatible avec python3:
http://kennethreitz.com/requests-python ... odule.html
Re: [requests] installer le module python requests (en cours
Publié : ven. 05 août 2011, 13:03
par Desintegr
En Python 3, tu as le module urllib.request.
Re: [requests] installer le module python requests (en cours
Publié : ven. 05 août 2011, 13:10
par djipey
Je connais un peu. Mais je cherchais un truc simple d'utilisation, le module requests avait le mérite d'être vraiment easy. Comme je ne suis pas très fort en python, c'est ce qu'il me fallait. Au passage, tu ne connaitrais pas un bon parser?
Re: [requests] installer le module python requests (en cours
Publié : ven. 05 août 2011, 13:13
par Desintegr
Pour un parser HTML :
lxml avec ou sans
html5lib selon les préférences.
Ce que j'aime surtout, c'est de pouvoir utiliser
XPath.
Plus d'infos :
Re: [requests] installer le module python requests (en cours
Publié : ven. 05 août 2011, 14:35
par djipey
C'est parfait merci, j'ai pu l'installer pour python3.
j'ai une dernière question pour toi: Je n'aurai besoin de ce module que pour parser une page HTML, renvoyer une réponse en ayant rempli un champ ou "cliqué" sur un lien, mais rien de très perfectionné. Selon toi, qu'est ce que je devrais lire dans la doc dans un premier temps? Est ce qu'il y a des sections qui ne sont pas utiles?
Je pensais commencer par lire la section "The lxml.etree Tutorial". Est ce un bon choix?
Re: [requests] installer le module python requests
Publié : lun. 08 août 2011, 17:50
par djipey
J'ai essayé lxml, mais j'ai du mal à parser bêtement la page. Pourrais tu jeter un oeil à mon code s'il te plait?
Code : Tout sélectionner
#!/usr/bin/python
import urllib.request
from lxml import etree
from io import StringIO
with urllib.request.urlopen('http://www.allocine.fr/') as file:
pagedata = file.read()
page = pagedata.decode('UTF-8')
parser = etree.HTMLParser()
tree = etree.parse(StringIO(page), parser)
result = etree.tostring(tree.getroot(), pretty_print=True, method="html", encoding='UTF-8')
print(result)
Ça ne parse rien du tout, ça me renvoie juste tout le contenu de la page, mais sans indention.
Re: [requests] installer le module python requests
Publié : lun. 08 août 2011, 18:12
par Desintegr
Parser consiste à faire l'analyse syntaxique d'un texte. Dans ton cas il s'agit d'une page web en HTML.
Ce que tu obtiens est ce qu'on appelle un
arbre syntaxique et est représenté par l'objet
tree (de type
etree) dans ton code.
Il est ensuite possible d'effectuer facilement toute sorte d'opération sur cet arbre.
Par exemple un arbre HTML simple (page avec titre et 3 paragraphes) peut être représenté comme ceci :
À toi d'utiliser l'API de
lxml pour obtenir ce que tu veux (extraire certains éléments, remplacer des éléments par d'autres, etc.)
Pour trouver et extraire des parties de la page, le plus simple est d'utiliser
XPath :
http://lxml.de/xpathxslt.html
Ce que tu fais dans ton code, c'est
parser la page HTML (obtenir l'arbre syntaxique) puis recréer la page à partir de l'arbre.
Ça n'a donc pas beaucoup d'intérêt.
Plus d'infos :
Re: [requests] installer le module python requests
Publié : lun. 08 août 2011, 18:32
par djipey
Je te l'accorde, ça n'a carrément aucun intérêt. Je te dirais même qu'avant, j'ai fait une version de ce script en bash avec des expressions régulières, et je récupérais ce qui m'intéressait dans le tas informe et sans indention.
Mais là je voudrais faire quelque chose de propre. Avec python 2.7 et beautifulSoup j'arrive à afficher l'arbre syntaxique sans problème, mais pas avec lxml. J'ai le résultat sur une seule ligne. C'est possible de le faire ça normalement, non? Parce que si je n'arrive même pas à faire ça, je ne vais pas aller très loin...
Re: [requests] installer le module python requests
Publié : lun. 08 août 2011, 20:22
par Desintegr
Pour afficher l'arbre, ça a l'air d'être simplement :
où
root est la racine de l'arbre :
Code : Tout sélectionner
>>> root = etree.XML("<root><test/></root>")
>>> etree.tostring(root)
b'<root><test/></root>'
>>> print(etree.tostring(root, pretty_print=True))
<root>
<test/>
</root>
Re: [requests] installer le module python requests
Publié : lun. 08 août 2011, 21:29
par djipey
Simplement...
Je dois mal m'y prendre, j'ai essayé plein de choses, mais rien ne fonctionne. Je te mets le code de mon script actuel, avec en commentaire mes tentatives infructueuses:
Code : Tout sélectionner
#!/usr/bin/python
import urllib.request
from lxml import etree
from io import StringIO
url = urllib.request.urlopen('http://www.allocine.fr/')
page = str(url.read())
#print(page)
root = etree.XML(page)
print(etree.tostring(root, pretty_print=True))
#parser = etree.HTMLParser()
#tree = etree.parse(StringIO(page), parser)
#result = etree.tostring(tree.getroot(), pretty_print=True, method="html")
#print(result)
#url.close()
#with urllib.request.urlopen('http://www.allocine.fr/') as file:
#charset = file.info().get_charset()
#if not charset:
#charset = "ascii"
#pagedata = file.read()
#page = pagedata.decode('ascii')
#parser = etree.HTMLParser()
#tree = etree.parse(page, parser)
#result = etree.tostring(tree.getroot(), pretty_print=True, method="html", encoding='UTF-8')
#print(result)
#page_accueil = open("page_accueil.txt","w")
#page_accueil.write(str(result))
#page_accueil.close()
#print(page)
Pour info, le code actuellement décommenté me renvoie ça:
Code : Tout sélectionner
Traceback (most recent call last):
File "/home/djipey/Desktop/python/allocine/allocine.py", line 13, in <module>
root = etree.XML(page)
File "lxml.etree.pyx", line 2723, in lxml.etree.XML (src/lxml/lxml.etree.c:52448)
File "parser.pxi", line 1573, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:79932)
File "parser.pxi", line 1445, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:78709)
File "parser.pxi", line 920, in lxml.etree._BaseParser._parseUnicodeDoc (src/lxml/lxml.etree.c:75083)
File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739)
File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614)
File "parser.pxi", line 585, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955)
lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1
Re: [requests] installer le module python requests
Publié : mar. 09 août 2011, 07:39
par Desintegr
la fonction
etree.XML doit être utilisée uniquement avec du
XML pur.
Pour
parser du
HTML à partir d'une chaîne de caractère, il faut utiliser la fonction
lxml.html.fromstring ou la fonction
lxml.html.html5parser.fromstring
La différence entre les deux :
There are a few differences in the returned tree to the regular HTML parsing functions from lxml.html.
html5lib normalizes some elements and element structures to a common format.
For example even if a tables does not have a tbody html5lib will inject one automatically
Tu cherches vraiment à faire compliqué !
Voici un exemple minimal fonctionnel (testé avec Python 2) :
Code : Tout sélectionner
import lxml.html
import lxml.etree
tree = lxml.html.parse('http://www.allocine.fr')
print(lxml.etree.tostring(tree, pretty_print=True))
La première ligne
parse la page et retourne l'arbre.
La seconde affiche l'arbre obtenu.
Ensuite, tu peux utiliser
XPath pour trouver des éléments dans la page :
http://lxml.de/xpathxslt.html
Exemple (Python 2) avec XPath pour afficher tous les liens de la page :
Code : Tout sélectionner
for link in tree.xpath('//a'):
if 'href' in link.attrib:
print(u'{}: {}'.format(link.attrib['href'], link.text))
Re: [requests] installer le module python requests
Publié : mar. 09 août 2011, 11:42
par djipey
Ok, et bien c'est simple, ça ne marche tout simplement pas en python3. Les deux codes marchent nickel avec python2, mais pas avec python3.
Mais bordel, ça fait un temps fou que python3 est sorti, et tous les modules un peu sympa ne marchent qu'avec python 2...
Tu as surement une meilleure vue d'ensemble que moi, est ce que beaucoup de monde utilise encore python 2.7?
Re: [requests] installer le module python requests
Publié : mar. 09 août 2011, 11:59
par Desintegr
La dernère version de
lxml est compatible avec
Python 3.2 :
The latest release works with all CPython versions from 2.3 to 3.2
Je viens de tester en installant
lxml via
pip, mon code fonctionne avec
Python 3.
Il faut juste enlever le
u de
unicode à la ligne du
print.
Pour info :
http://diveintopython3.org/strings.html#divingin
In Python 3, all strings are sequences of Unicode characters.
Re: [requests] installer le module python requests
Publié : ven. 12 août 2011, 20:08
par djipey
Je ne suis pas arrivé à le faire fonctionner
J'ai suivi ton conseil initial et j'ai fait le script en python 2. Plus facile en fait, parce que du coup je peux me servir de requests et beautifoulSoup, qui sont franchement enfantins à l'usage. Je vais créer un autre post pour prendre avis et conseils des gens sur mon code.
Merci à toi en tout cas.