[requests] installer le module python requests (résolu)

Autres projets et contributions
Répondre
djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

[requests] installer le module python requests (résolu)

Message par djipey » ven. 05 août 2011, 12:16

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?
Dernière modification par djipey le ven. 12 août 2011, 20:08, modifié 1 fois.

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests (en cours

Message par Desintegr » ven. 05 août 2011, 12:35

Essaye plutôt avec pip2. Le module ne doit pas être compatible avec Python 3.

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests (en cours

Message par djipey » ven. 05 août 2011, 13:00

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
Dernière modification par djipey le ven. 05 août 2011, 13:03, modifié 1 fois.

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests (en cours

Message par Desintegr » ven. 05 août 2011, 13:03

En Python 3, tu as le module urllib.request.

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests (en cours

Message par djipey » ven. 05 août 2011, 13:10

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?

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests (en cours

Message par Desintegr » ven. 05 août 2011, 13:13

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 :

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests (en cours

Message par djipey » ven. 05 août 2011, 14:35

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?

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests

Message par djipey » lun. 08 août 2011, 17:50

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.

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests

Message par Desintegr » lun. 08 août 2011, 18:12

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 :

Code : Tout sélectionner

html
  |- head
      |- title
  |- body
      |- p
      |- p
      |- p
À 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 :

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests

Message par djipey » lun. 08 août 2011, 18:32

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...

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests

Message par Desintegr » lun. 08 août 2011, 20:22

Pour afficher l'arbre, ça a l'air d'être simplement :

Code : Tout sélectionner

print(etree.tostring(root, pretty_print=True))
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>

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests

Message par djipey » lun. 08 août 2011, 21:29

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

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests

Message par Desintegr » mar. 09 août 2011, 07:39

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))

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests

Message par djipey » mar. 09 août 2011, 11:42

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?

Avatar de l’utilisateur
Desintegr
Chu Ko Nu
Messages : 354
Inscription : jeu. 28 avr. 2011, 16:42
Localisation : Orléans - France

Re: [requests] installer le module python requests

Message par Desintegr » mar. 09 août 2011, 11:59

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.

djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [requests] installer le module python requests

Message par djipey » ven. 12 août 2011, 20:08

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.

Répondre