Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

w3lib / cannot import name replace_entities

+2 votes

J'utilise Scrapy 1.0.3, et la version de w3lib est 1.13.0 lorsque j'essaie de faire fonctionner un script j'ai le message d'erreur suivant :

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    from scrapy.crawler import Crawler
  File "/usr/local/lib/python2.7/dist-packages/scrapy/__init__.py", line 48, in <module>
    from scrapy.spiders import Spider
  File "/usr/local/lib/python2.7/dist-packages/scrapy/spiders/__init__.py", line 115, in <module>
    from scrapy.spiders.crawl import CrawlSpider, Rule
  File "/usr/local/lib/python2.7/dist-packages/scrapy/spiders/crawl.py", line 11, in <module>
    from scrapy.utils.spider import iterate_spider_output
  File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/spider.py", line 7, in <module>
    from scrapy.utils.misc import  arg_to_iter
  File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/misc.py", line 8, in <module>
    from w3lib.html import replace_entities
ImportError: cannot import name replace_entities

J'ai tenté d'importer replaceentities à la main dans un terminal j'ai obtenu la même erreur.
J'ai tenté de faire une mise-à-jour et j'ai les dernières versions semble-t-il.
J'ai regardé dans /usr/local/lib/python2.7/dist-packages/w3lib... et j'ai bien un module replace
entities.

demandé 24-Nov-2015 par Nickko (140 points)

J'ai corrigé le problème en retirant w3lib avec PIP sudo pip uninstall w3lib et tenté de relancer le programme, résultat, toujours la même erreur alors que je m'attendais à ne pas pouvoir importer w3lib.

J'ai donc fait un locate w3lib, j'ai trouvé plein d'autres fichiers, dont un dans le cache de dpkg, je me suis dit que w3lib avait du être installé également par aptitude. De plus sur Raspberry (ma plateforme) les paquets ne sont pas super à jour.

un petit : sudo aptitude purge python-w3lib j'ai supprimé les autres dossiers à l'aide de rm -r j'ai lancé updadedb et confirmé la désinstallation avec un nouveau locate w3lib

J'ai réinstallé w3lib via PIP : sudo pip install w3lib et ça fonctionne.

1 Réponse

+2 votes

D'après le setup.py pour Scrapy version 1.0 il faut w3lib>=1.8.0 et toi tu dis avoir la 1.13.0

install_requires=[
    'Twisted>=10.0.0',
    'w3lib>=1.8.0',
    'queuelib',
    'lxml',
    'pyOpenSSL',
    'cssselect>=0.9',
    'six>=1.5.2',
    'service_identity',
],

Essais un, désinstalle l'ancienne version avant:

pip install --upgrade w3lib 
répondu 24-Nov-2015 par max (892 points)

La 1.13.0 est bien supérieure 1.8.0, non ?

J'ai omis de le préciser mais j'ai déjà procéder à une désinstallation / réinstallation complète de Scrapy et de ses dépendances mais ça n'avait rien changé :-(

ouais sorry.

Je viens de tester et j'ai pas d'erreur d'import. Tu peux pas importer w3lib ou juste replace_entities de w3lib ?

Je peux importer w3lib et même w3lib.html mais je ne peux pas appeller le module replace_entities.

Merci Max, grâce à tes indications j'ai réussi à me débloquer.
Le fait que ça fonctionne chez toi et pas chez moi m'a confirmé que le problème était du à ma configuration.

J'ai donc retiré w3lib avec PIP sudo pip uninstall w3lib et tenté de relancer le programme, résultat, toujours la même erreur alors que je m'attendais à ne pas pouvoir importer w3lib.

J'ai donc fait un locate w3lib, j'ai trouvé plein d'autres fichiers, dont un dans le cache de dpkg, je me suis dit que w3lib avait du être installé également par aptitude. De plus sur Raspberry (ma plateforme) les paquets ne sont pas super à jour.

un petit : sudo aptitude purge python-w3lib j'ai supprimé les autres dossiers à l'aide de rm -r j'ai lancé updadedb et confirmé la désinstallation avec un nouveau locate w3lib

J'ai réinstallé w3lib via PIP : sudo pip install w3lib et ça fonctionne.

La vie est belle!

Copie ton commentaire et fais-en une réponse que tu accepteras, comme ça ça servira au prochain ;)

...