ImportError: Нет модуля с именем [имя].items

Я пытаюсь запустить свой собственный проект scrapy. Я думал, что решил связанную проблему в теме, которую я разместил здесь: [urlparse: ModuleNotFoundError, предположительно в Python2.7 и под conda

Я выполнил полное восстановление образа системы и просто установил Python 2.7 и Miniconda. Однако редактор Atom по-прежнему помечает/подчеркивает «import urlparse».

Код основан на хорошо написанной книге, и автор предоставляет отличную игровую площадку для виртуальных машин для запуска сценариев, приведенных в книге. В ВМ код работает нормально.

Однако, пытаясь попрактиковаться самостоятельно, я получаю следующую ошибку:

(p2env) C:\Users\User-1\Desktop\scrapy_projects\dictionary>scrapy crawl basic Traceback (most recent call last): File "C:\Users\User-1\Miniconda2\envs\p2env\Scripts\scrapy-script.py", line 5, in <module> sys.exit(scrapy.cmdline.execute()) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\cmdline.py", line 148, in execute cmd.crawler_process = CrawlerProcess(settings) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\crawler.py", line 243, in __init__ super(CrawlerProcess, self).__init__(settings) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\crawler.py", line 134, in __init__ self.spider_loader = _get_spider_loader(settings) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\crawler.py", line 330, in _get_spider_loader return loader_cls.from_settings(settings.frozencopy()) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\spiderloader.py", line 61, in from_settings return cls(settings) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\spiderloader.py", line 25, in __init__ self._load_all_spiders() File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\spiderloader.py", line 47, in _load_all_spiders for module in walk_modules(name): File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\utils\misc.py", line 71, in walk_modules submod = import_module(fullpath) File "C:\Users\User-1\Miniconda2\envs\p2env\lib\importlib\__init__.py", line 37, in import_module __import__(name) File "C:\Users\User-1\Desktop\scrapy_projects\dictionary\dictionary\spiders\basic.py", line 11, in <module> from terms.items import TermsItem ImportError: No module named terms.items

Моя иерархия папок выглядит следующим образом:

└───dictionary
│   scrapy.cfg
│
└───dictionary
    │   items.py
    │   middlewares.py
    │   pipelines.py
    │   settings.py
    │   settings.pyc
    │   __init__.py
    │   __init__.pyc
    │
    └───spiders
            basic.py
            basic.pyc
            __init__.py
            __init__.pyc

Мой код items.py выглядит следующим образом:

# -*- coding: utf-8 -*-

from scrapy.item import Item, Field


class TermsItem(Item):
    # Primary fields
    title = Field()
    definition = Field()
    # Housekeeping fields
    url = Field()
    project = Field()
    spider = Field()
    server = Field()
    date = Field()

Мой Spider.py выглядит следующим образом:

# -*- coding: utf-8 -*-

import datetime
import urlparse
import socket
import scrapy

from scrapy.loader.processors import MapCompose, Join
from scrapy.loader import ItemLoader

from terms.items import TermsItem


class BasicSpider(scrapy.Spider):
    name = "basic"
    allowed_domains = ["web"]

    # Start on a property page
    start_urls = (
        'http://dictionary.com/browse/there',
    )

    def parse(self, response):
        # Create the loader using the response
        l = ItemLoader(item=TermsItem(), response=response)

        # Load fields using XPath expressions
        l.add_xpath('title', '//h1[@class="head-entry"][1] / text()',
                    MapCompose(unicode.strip, unicode.title))
        l.add_xpath('definition', '//*[@class="def-list"][1]/text()',
                    MapCompose(unicode.strip, unicode.title))

        # Housekeeping fields
        l.add_value('url', response.url)
        l.add_value('project', self.settings.get('BOT_NAME'))
        l.add_value('spider', self.name)
        l.add_value('server', socket.gethostname())
        l.add_value('date', datetime.datetime.now())

        return l.load_item()

Редактор Atom по-прежнему помечает «import urlparse» и «from scrapy.loader.processors import MapCompose, Join»< /а>

Основываясь на этом вопросе о стеке: Scrapy ImportError: нет модуля с именем Item, где находятся кодеры указано '**выполнить команду Scrapy из каталога верхнего уровня вашего проекта. – alecxe'** заставил меня задуматься, не вызывает ли ошибка среду conda, которую я использую? Вопрос о стеке Нет модулей с именами имеет аналогичную точку '**Что делает импорт? И какой рабочий каталог/содержимое sys.path. Вы не можете найти Project_L, если родительский каталог не является рабочим каталогом и не отображается в sys.path. — ShadowRanger 11 мая, 22:24'** Однако, насколько мне известно, я правильно структурирую проект, и соответствующая иерархия верна.

Любая помощь будет принята с благодарностью. Извиняюсь за длинный пост, я просто хотел быть как можно более полным и убедиться, что люди ценят разницу между этим вопросом и аналогичными, на которые я ссылался.

С уважением,


person R.Zane    schedule 10.09.2017    source источник
comment
Извините, я забыл упомянуть, что запуск оболочки $scrapy example.com из каталога верхнего уровня c:/.. .dictionary/ выдает ту же ошибку. Это еще один инцидент, который заставил меня задуматься, не связано ли это с установкой scrapy в среде conda (p2env).   -  person R.Zane    schedule 10.09.2017


Ответы (2)


След указывает, что проблема связана с определенным импортом. Вы можете проверить это из командной строки. Например, на моей машине я получаю

$ python -c 'from terms.items import TermsItem'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named terms.items

Глядя на иерархию ваших папок, я не вижу модуля под названием «термины», так что, вероятно, вам не хватает этого, но, поскольку вы указываете, что код работает на виртуальной машине автора, я бы попробовал запустить следующую команду на этой виртуальной машине:

$ python -v -c 'from terms.items import TermsItem'

Параметр -v заставит python показать вам все импортируемые пути.
например.

$ python -v -c 'from terms.items import TermsItem'
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site.pyc matches /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site.py
import site # precompiled from /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site.pyc
...
import encodings.ascii # precompiled from /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/encodings/ascii.pyc
Python 2.7.12 (default, Nov 29 2016, 14:57:54) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named terms.items
# clear __builtin__._
# clear sys.path
...
# cleanup ints: 20 unfreed ints
# cleanup floats

Если вы сделаете это там, где код работает, то где-то в этом выводе будет успешный импорт. Исходя из этого, вы можете определить имя отсутствующего модуля в вашей системе и установить его соответствующим образом.

РЕДАКТИРОВАТЬ: присмотревшись к вашему сообщению, я заметил, что вы упомянули, что ваш "items.py" содержит

class TermsItem(Item):
    # Primary fields
    ...

поэтому я подозреваю, что ваша проблема в том, что ваш импорт должен быть

from items import TermsItem
person jq170727    schedule 10.09.2017
comment
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат< /а>. Если были получены какие-либо релевантные/полезные сведения, их следует отредактировать обратно в этот ответ. - person Cody Gray; 11.09.2017

Вкратце, я смог найти решение и обойти ошибку, заменив:

from terms.items import TermsItem

с

from ..items import TermsItem

Это решение и его варианты уже были предоставлены в ссылке, которую я изначально приложил выше:

Scrapy ImportError: нет модуля с именем Item

Я уверен, что пробовал это изначально, однако я подозреваю, что когда я пытался повторно запустить код, я, должно быть, забыл сохранить его и, таким образом, извлекал из предыдущего .pyc

Следует отметить, что книга, на которой основан код, и вышеупомянутая ссылка Scrapy ImportError: Нет модуля с именем Item указывает, что мой исходный код

from terms.items import TermsItem

должен работать. Я настоятельно рекомендую тем, кто столкнулся с той же ошибкой, кто уже попробовал решения, представленные в связанных вопросах о стеке, на которые я ссылался, и убедился, что имя родительского каталога отличается от имени паука, чтобы просмотрите комментарии, сделанные в этой теме jq170727. Этот человек дает отличные инструкции о том, как использовать параметр -v, чтобы лучше идентифицировать проблему, и включил ссылку на очень подробный задокументированный им метод отслеживания ошибок, который использует команду PYTHONVERBOSE. Я абсолютный новичок и поэтому не смог в полной мере оценить, каковы последствия, однако я опубликую то, что, по моему мнению, является проблемой, отслеживаемой методом jq170727:

import scrapy.loader.processors # precompiled from C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\loader\processors.pyc
Traceback (most recent call last):

Я считаю, что это возникает из-за использования среды conda, которую я использую для размещения Python2.7 и Scrapy, которые я использую. Опять же, в полной ветке я ссылаюсь и цитирую точки, связанные с другими участниками потока стека, которые, как я думаю, могут позволить кому-то полностью исправить свою проблему (поскольку я все еще очень зеленый в этом).

person R.Zane    schedule 10.09.2017
comment
Я рад, что у вас работает импорт, но я думаю, что вы можете неправильно интерпретировать строку import scrapy.loader.processors. Это не причина, скорее это последний успешный импорт перед from terms.items import TermsItem, который не удался с ImportError: No module named terms.items. - person jq170727; 11.09.2017
comment
Да, вы правильно понимаете, что ранее сегодня я ошибочно думал, что проблема была в строке «import scrapy.loader.processors». Однако, прочитав ваш ответ и сделав вывод о контексте, я понял, что был на неверном пути. После запуска подробной команды в проектах виртуальной машины и учебника моя оценка вашей точки зрения стала лучше согласовываться. Опять же, очень ценю помощь. Это упражнение было полезным... даже приятным. - person R.Zane; 11.09.2017