处理时 Scrapy KeyError
Scrapy KeyError while processing
我找不到我的问题的任何答案,所以我希望可以在这里提问。
我正在尝试取消电影放映,但仍然出现以下错误。
真正让我感到困惑的是,问题显然出在管道上。但是,我有第二个用于歌剧院的蜘蛛,其代码完全相同(只是地方不同)并且工作正常。"Shows" 和 "Place" 指的是我的 Django 模型。我已将它们的字段更改为 CharFields,因此 date/time 格式错误不是问题。
我也尝试使用专用的 scrapy item "KikaItem" 而不是 "ShowItem"(与我的 opera spider 共享),但错误仍然存在。
class ScrapyKika(object):
def process_item(self, ShowItem, spider):
place, created = Place.objects.get_or_create(name="kino kika")
show = Shows.objects.update_or_create(
time=ShowItem["time"],
date=ShowItem["date"],
place=place,
defaults={'title': ShowItem["title"]}
)
return ShowItem
这是我的蜘蛛 code.I 预计问题出在此处,因为我在这里使用的方法与歌剧中的不同。但是,我不确定有什么问题。
import scrapy
from ..items import ShowItem, KikaItemLoader
class KikaSpider(scrapy.Spider):
name = "kika"
allowed_domains = ["http://www.kinokika.pl/dk.php"]
start_urls = [
"http://www.kinokika.pl/dk.php"
]
def parse(self, response):
divs = response.xpath('//b')
for div in divs:
l = KikaItemLoader(item=ShowItem(), response=response)
l.add_xpath("title", "./text()")
l.add_xpath("date", "./ancestor::ul[1]/preceding-sibling::h2[1]/text()")
l.add_xpath("time", "./preceding-sibling::small[1]/text()")
return l.load_item()
ItemLoader
class KikaItemLoader(ItemLoader):
title_in = MapCompose(strip_string,lowercase)
title_out = Join()
time_in = MapCompose(strip_string)
time_out = Join()
date_in = MapCompose(strip_string)
date_out = Join()
感谢您的宝贵时间,如有任何拼写错误,我们深表歉意:)
目前,您的蜘蛛生成了一个项目:
{'title': u' '}
未填写 date
和 time
字段。这是因为您在蜘蛛中初始化 ItemLoader
class 的方式。
您应该在初始化项目加载器时考虑到特定的选择器。替换:
for div in divs:
l = KikaItemLoader(item=ShowItem(), response=response)
与:
for div in divs:
l = KikaItemLoader(item=ShowItem(), selector=div)
我找不到我的问题的任何答案,所以我希望可以在这里提问。
我正在尝试取消电影放映,但仍然出现以下错误。
真正让我感到困惑的是,问题显然出在管道上。但是,我有第二个用于歌剧院的蜘蛛,其代码完全相同(只是地方不同)并且工作正常。"Shows" 和 "Place" 指的是我的 Django 模型。我已将它们的字段更改为 CharFields,因此 date/time 格式错误不是问题。
我也尝试使用专用的 scrapy item "KikaItem" 而不是 "ShowItem"(与我的 opera spider 共享),但错误仍然存在。
class ScrapyKika(object):
def process_item(self, ShowItem, spider):
place, created = Place.objects.get_or_create(name="kino kika")
show = Shows.objects.update_or_create(
time=ShowItem["time"],
date=ShowItem["date"],
place=place,
defaults={'title': ShowItem["title"]}
)
return ShowItem
这是我的蜘蛛 code.I 预计问题出在此处,因为我在这里使用的方法与歌剧中的不同。但是,我不确定有什么问题。
import scrapy
from ..items import ShowItem, KikaItemLoader
class KikaSpider(scrapy.Spider):
name = "kika"
allowed_domains = ["http://www.kinokika.pl/dk.php"]
start_urls = [
"http://www.kinokika.pl/dk.php"
]
def parse(self, response):
divs = response.xpath('//b')
for div in divs:
l = KikaItemLoader(item=ShowItem(), response=response)
l.add_xpath("title", "./text()")
l.add_xpath("date", "./ancestor::ul[1]/preceding-sibling::h2[1]/text()")
l.add_xpath("time", "./preceding-sibling::small[1]/text()")
return l.load_item()
ItemLoader
class KikaItemLoader(ItemLoader):
title_in = MapCompose(strip_string,lowercase)
title_out = Join()
time_in = MapCompose(strip_string)
time_out = Join()
date_in = MapCompose(strip_string)
date_out = Join()
感谢您的宝贵时间,如有任何拼写错误,我们深表歉意:)
目前,您的蜘蛛生成了一个项目:
{'title': u' '}
未填写 date
和 time
字段。这是因为您在蜘蛛中初始化 ItemLoader
class 的方式。
您应该在初始化项目加载器时考虑到特定的选择器。替换:
for div in divs:
l = KikaItemLoader(item=ShowItem(), response=response)
与:
for div in divs:
l = KikaItemLoader(item=ShowItem(), selector=div)