ImportError: No module named [name].items

ImportError: No module named [name].items

我正在尝试 运行 我自己的 scrapy 项目。我以为我在 post 编辑的帖子中解决了一个相关问题:[

我做了 完整的系统映像恢复 并简单地安装了 Python 2.7 和 Miniconda。但是,Atom 编辑器仍然是 flagging/underlining 'import urlparse'。

代码基于一本写得很好的书,作者为书中示例的 运行 脚本提供了一个很好的虚拟机游乐场。在 VM 中,代码工作正常。

但是,在尝试自己练习时,我现在收到以下错误:

(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 Editor still flags 'import urlparse' and 'from scrapy.loader.processors import MapCompose, Join'

基于这个 Whosebug 问题: where coders are instructed to '**execute the Scrapy command from inside the top level directory of your project. – alecxe'** has me wondering if the conda environment I am using is causing the error? No module named items stack 问题有一个相似点 '**导入是做什么的? sys.path 的工作 directory/the 内容是什么?如果父目录不是工作目录并且没有出现在 sys.path 中,则无法找到 Project_L。 – ShadowRanger 5 月 11 日 22:24'** 但是,据我所知,我正在正确构建项目并且相应的层次结构是正确的。

如有任何帮助,我们将不胜感激。为冗长的 post 道歉,我只是想尽可能全面,并确保人们理解这个问题与我链接到的类似问题之间的区别。

此致,

回溯表明问题出在特定的导入中。 您可以从命令行验证这一点。例如在我的 我得到的机器

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

查看您的文件夹层次结构,我看不到名为 "terms" 的模块 所以这可能就是你所缺少的,但既然你指出了 代码在作者的 VM 中运行我会做的是尝试 运行 该 VM 中的以下命令:

$ 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

如果你在代码有效的地方这样做,那么输出中的某个地方将会 成为成功的进口。从中你可以算出 系统上缺少的模块并相应地安装它。

编辑:仔细观察你的 post 我注意到你提到你的 "items.py" 包含

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

所以我怀疑你的问题是你的导入应该是

from items import TermsItem

简而言之,我能够生成一个解决方案并通过替换来绕过错误:

from terms.items import TermsItem

from ..items import TermsItem

此解决方案及其变体已在 link 中提供,我最初在上面附上:

我确定我最初尝试过,但是我怀疑当我尝试重新 运行 代码时我一定是忘记保存了,因此从之前的 .pyc

需要说明的是,代码出自那本书,前面提到的link表示我的原代码

from terms.items import TermsItem

应该可以。 我强烈推荐给那些遇到同样错误的人,他们已经尝试过我link编辑的相关堆栈流问题中提供的解决方案,并确保区分父级蜘蛛名称中的目录名称,以查看 jq170727 在此线程中所做的评论。该个人提供了有关如何使用 -v 选项更好地识别问题的重要说明,并在他记录的使用 PYTHONVERBOSE 命令的非常详细的错误跟踪方法中包含了 link。我是一个新手,因此此时无法完全理解其中的含义,但是,我将 post 我认为是从 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):

我认为这是由于使用了我目前用来容纳 Python2.7 和我正在使用的 Scrapy 的 conda 环境。同样,在完整的线程中,我 link 并引用了其他 stackflow 贡献者的相关观点,我认为这可能会让某人完全纠正他们的问题(因为我在这方面仍然很新)。