无法从Scrapy Items.py文件导入字段对象

1 投票
1 回答
1255 浏览
提问于 2025-04-18 13:10

我正在尝试使用以下导入语句来在一个 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()   

谢谢

1 个回答

1

首先针对一般的scrapy项目,你需要运行scrapy命令

要理解test指的是什么有点困难,因为你的项目似乎叫mrscrap。如果你想从items.py文件中导入fixture,那么这条语句应该是:

from mrscrap.items import fixture

这需要在mrscrap\目录下有一个__init__.py文件,但在用scrapy创建项目时,这个文件默认应该是存在的。

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

你可以使用相对导入来实现这一点,具体可以参考PEP 328

from ..items import fixture

这要求你在一个当前活跃的包中,所以你需要在你的爬虫目录下有一个__init__.py文件(即使是空的也可以)。

撰写回答