【问题标题】:ImportError: No module named [name].itemsImportError:没有名为 [name].items 的模块
【发布时间】:2017-09-10 01:36:39
【问题描述】:

我正在尝试运行我自己的 scrapy 项目。我以为我在此处发布的线程中解决了一个相关问题:[urlparse: ModuleNotFoundError, presumably in Python2.7 and under conda

我做了一个完整的系统映像恢复,并简单地安装了 Python 2.7 和 Miniconda。但是,Atom 编辑器仍在标记/下划线“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'

基于这个 stackoverflow 问题:Scrapy ImportError: No module named Item 其中指示编码人员 '**从项目的顶级目录中执行 Scrapy 命令。 – alecxe'** 让我想知道我使用的 conda 环境是否导致错误? No module named itemsstack question 也有类似的点'**什么是导入?什么是工作目录/sys.path 的内容。如果父目录不是工作目录且未出现在 sys.path 中,则找不到 Project_L。 – ShadowRanger 5 月 11 日 22:24'** 但是,据我所知,我正确地构建了项目并且相应的层次结构是正确的。

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

问候,

【问题讨论】:

  • 抱歉,我忘了说从顶级目录 c:/...dictionary/ 中运行 $scrapy shell example.com 会产生同样的错误。这是另一个让我想知道它是否与在 conda 环境 (p2env) 中安装 scrapy 有关的事件。

标签: python-2.7 scrapy miniconda


【解决方案1】:

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

from terms.items import TermsItem

from ..items import TermsItem

我最初附在上面的链接中已经提供了这个解决方案及其变体:

Scrapy ImportError: No module named Item

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

需要注意的是代码所依据的书,以及上述链接Scrapy ImportError: No module named Item表示我的原始代码

from terms.items import TermsItem

应该可以工作。 我强烈推荐给遇到同样错误的人,他们已经尝试过我链接的相关 stackflow 问题中提供的解决方案,并确保将父目录名称与蜘蛛名称区分开来,以查看 jq170727 在此线程中制作的 cmets。个人提供了有关如何使用 -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。同样,在完整的线程中,我链接并引用了其他 stackflow 贡献者的相关点,我认为这可能会让某人完全纠正他们的问题(因为我对此仍然很陌生)。

【讨论】:

  • 我很高兴您可以导入,但我认为您可能误解了 import scrapy.loader.processors 行。这不是原因,而是from terms.items import TermsItem 之前的最后一次成功导入,它以ImportError: No module named terms.items 失败。
  • 是的,您正确地认识到今天早些时候我错误地认为“import scrapy.loader.processors”行是问题所在。但是,在阅读了您的回复并推断出上下文之后,我认为我走错了路。在 VM 和教程项目上运行详细命令后,我对您的观点的理解更加一致。再次,非常感谢您的帮助。这个练习很有帮助……甚至令人愉快。
【解决方案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

【讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat。如果收集到任何相关/有用的见解,他们应该edited 回到这个答案中。
猜你喜欢
  • 2013-03-11
  • 2012-12-07
  • 2012-05-23
  • 2019-07-29
  • 2015-07-04
  • 2014-03-15
  • 2017-12-29
  • 2014-09-12
  • 2017-05-09
相关资源
最近更新 更多