【问题标题】:Unable to import field object from Scrapy Items.py file无法从 Scrapy Items.py 文件中导入字段对象
【发布时间】:2014-07-13 19:03:47
【问题描述】:

我正在尝试使用以下导入语句将字段引入Scrapy 蜘蛛:

from test.items import fixture

在这种情况下,test.py 是一个 Scrapy 脚本,包含在文件夹路径中:

C:\Python27\mrscrap\mrscrap\spiders\test.py

文件 Items.py 比它高一级,包含在文件夹路径中:

C:\Python27\mrscrap\mrscrap\items.py

这行代码产生了错误:

No module named items

我在逻辑'test.items' 中使用了正确的文件名吗?我的文件items.py 是否在正确的位置?

我的完整代码是这样的:

from scrapy.spider import Spider
from scrapy.http import Request
from mrscrap.items import Fixture
from scrapy.utils.markup import remove_tags
from scrapy.cmdline import execute
import re

class GoalSpider(Spider):
    name = "goal"
    allowed_domains = ["whoscored.com"]
    start_urls = (
        'http://www.whoscored.com/',
        )

    def parse(self, response):
        return Request(
            url="http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney",
            callback=self.parse_fixtures
        )

    def parse_fixtures(self,response):
        sel = response.selector
        for tr in sel.css("table#player-fixture>tbody>tr"):
             item = Fixture()
             item['tournament'] = tr.xpath('td[@class="tournament"]/span/a/text()').extract()
             item['date'] = tr.xpath('td[@class="date"]/text()').extract()
             item['team home'] = tr.xpath('td[@class="team home "]/a/text()').extract()
             yield item

execute(['scrapy','crawl','goal'])

Items.py 中的类是这样写的:

class Fixture(Item):
    tournament = Field()
    date = Field()
    team_home = Field()   

谢谢

【问题讨论】:

  • 也许您同时更改了文件夹名称。

标签: python scrapy


【解决方案1】:

一般scrapy项目的第一个答案,您可以在其中运行scrapy命令

有点难以理解test 所引用的内容,因为您的项目似乎被命名为mrscrap。如果您尝试从 items.py 文件导入 fixture 引用,则语句应为:

from mrscrap.items import fixture

这需要__init__.py 文件存在于mrscrap\ 中,但在使用scrapy 创建项目后默认情况下它应该存在。

直接从其目录运行爬虫(如更新)

您可以通过相对导入来做到这一点,如PEP 328 所示。

from ..items import fixture

这要求您处于当前活动的包中,因此您的蜘蛛目录中必须有一个 __init__.py 文件(虽然是空的)。

【讨论】:

  • 在与 items.py 相同的位置有一个 init.py 文件...但是上面的代码会产生错误“没有名为 mrscrap.items 的模块”。这与使用'from test.items import fixture 生成的错误'no module named items'略有不同。我不明白我做错了什么?
  • init.py 文件是空的。对吗?
  • 是的,没错。当您遇到错误时,您在哪里运行您的项目?您是否从第一个 mrscrap` directory? (and not mrscrap\mrscrap` 运行 scrapy 命令。您实际上是在尝试从 items.py 中导入符号 fixture,还是在尝试使用某种单元测试框架?
  • 我已经修改了我的问题以在上面显示我的完整代码。我尝试通过 F5 - Python IDLE 中的运行模块和命令提示符运行代码。我最初是从 mrscrap/mrscrap 位置运行“scrapy crawl goal”命令,但现在我已将其修改为仅在 mrscrap 的上一层,但仍然收到相同的错误。
  • 我已经更新了答案,尽管我的经验是在测试时最好通过scrapy工具(使用 parse 和 -r / --pipelines 等)运行蜘蛛,因为它给了你带有日志记录等的整个scrapy框架。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多